学习《Real Time Rendering》后自己实现的代码:
演示程序下载:http://download.csdn.net/detail/jiangcaiyang123/4007231
程序截图:

这是书上的截图:

考完试后我就开始继续钻研我的游戏开发。前几天我完成了游戏开发的最基础的工作,也就是说
在此基础上进行游戏开发效率更高,速度更快。而且我在看《Real Time Rendering》这本书受到了很多启发。使用类MFC的开发模式可以很好的提高开发的效率。好了,接下来介绍的是我最近在钻研的矩阵变换的问题。
在游戏中一般有三个矩阵:视角矩阵、世界矩阵和投影矩阵。简单地说,视角矩阵就是观察者眼睛所在的矩阵,世界矩阵则是目标物体所在世界的矩阵,投影矩阵则好比为观察者的眼睛的晶状体。通过三个矩阵的相互作用可以模拟出所有三维的场景。在这里我就不再过多地赘述有关矩阵的内容了。因为书没有直接的代码,所以我靠自己的一点知识就实现了书上的例子程序。程序的截图如下:

我在代码中添加了必要的注释,所以代码基本上还是好懂的。
// GameStart.h 游戏开始的场景
// 2012年1月5日11:41:29 最后编辑
#ifndef _GAMESTART_H_
#define _GAMESTART_H_
#include <vector>
#include <d3dx9.h>
#include "../DX框架/Scenario.h"
#include "../DX框架/GameShape.h"
#include "../DX框架/JCYInput.h"
#pragma comment( lib, "d3dx9.lib" )
class CGameStart: public IScenario
{
public:
CGameStart( TCHAR* pName, HINSTANCE hInst, HWND hWnd, LPDIRECT3DDEVICE9 pDevice ); // 构造函数
~CGameStart( void ); // 析构函数
void Draw( void ); // 绘图
unsigned long Release( void ); // 释放空间
TCHAR* GetName( void ) // 获取场景名
{
return m_Name;
}
void InitializeViewport( void ); // 初始化视角
private:
TCHAR* m_Name; // 场景名
HWND m_hWnd; // 窗口句柄
LPDIRECT3DDEVICE9 m_pDevice; // D3D设备
LPDIRECT3DVERTEXBUFFER9 m_pBuffer; // 顶点缓存
CInput m_BufferInput, m_ImmediateInput; // 输入系统
D3DXMATRIX m_WorldMatrix; // 世界矩阵
D3DXMATRIX m_ViewMatrix; // 视角矩阵
D3DXMATRIX m_ProjectMatrix; // 投影矩阵
D3DVIEWPORT9 m_RViewport; // 旋转视角
D3DVIEWPORT9 m_SRTViewport; // 比例旋转视角
D3DVIEWPORT9 m_TRViewport; // 转置视角
D3DVIEWPORT9 m_RTRSViewport; // 旋转转置旋转视角
struct STVertex // 定义自己的顶点结构体
{
float x, y, z;
unsigned long color;// 在DirectX中D3DCOLOR被解释成unsigned long
};
static const unsigned short POINT_FVF = D3DFVF_XYZ | D3DFVF_DIFFUSE; // 灵活顶点格式
};
#endif
// GameStart.cpp 游戏开始的场景的实现文件
// NUM_VERTICES12年1月5日12:22:17 最后编辑
#include <d3d9.h>
#include "GameStart.h"
#define NUM_VERTICES 50
CGameStart::CGameStart( TCHAR *pName, HINSTANCE hInst, HWND hWnd, LPDIRECT3DDEVICE9 pDevice )// 构造函数
{
m_hWnd = hWnd;
m_pDevice = pDevice;
m_pDevice->SetRenderState( D3DRS_LIGHTING, FALSE );
D3DXMatrixIdentity( &m_ViewMatrix );
m_pDevice->SetTransform( D3DTS_VIEW, &m_ViewMatrix );
InitializeViewport( );
// 初始化顶点缓存
m_pDevice->CreateVertexBuffer( NUM_VERTICES * sizeof( STVertex ), D3DUSAGE_DYNAMIC | D3DUSAGE_POINTS, POINT_FVF,
D3DPOOL_DEFAULT, &m_pBuffer, NULL );
STVertex* pVertices;
m_pBuffer->Lock( 0, NUM_VERTICES * sizeof( STVertex ), (void**)&pVertices, D3DLOCK_DISCARD );
for ( long i = 0; i < NUM_VERTICES; i++ )
{
float angle = (float)i / (float)NUM_VERTICES * 2.0f * D3DX_PI;
pVertices[i].x = 0.3f * cos( angle );
pVertices[i].y = 0.3f * sin( angle );
pVertices[i].z = 1.0f;
pVertices[i].color = D3DCOLOR_XRGB( 255, 255, 255 );
}
m_pBuffer->Unlock( );
m_pDevice->SetStreamSource( 0, m_pBuffer, 0, sizeof( STVertex ) ); // 相同资源的顶点缓存要在一起为好
m_pDevice->SetFVF( POINT_FVF );
/*----------初始化输入------------*/
m_ImmediateInput.Initialize( IMMEDIATE, hInst, m_hWnd );
m_BufferInput.Initialize( BUFFERED, hInst, m_hWnd );
m_Name = pName;
}
CGameStart::~CGameStart( void ) // 析构函数
{
Release( );
}
unsigned long CGameStart::Release( void ) // 释放空间
{
m_pBuffer->Release( );
m_ImmediateInput.Release( );
m_BufferInput.Release( );
return 0;
}
void CGameStart::Draw( void ) // 绘图
{
RECT windowRect;
GetClientRect( m_hWnd, &windowRect );
D3DXMatrixPerspectiveFovLH( &m_ProjectMatrix, D3DX_PI / 4, float( windowRect.right - windowRect.left ) / float( windowRect.bottom - windowRect.top ), 1.0f, 100.0f );
m_pDevice->SetTransform( D3DTS_PROJECTION, &m_ProjectMatrix );
D3DXMATRIX rotationMatrix1;
D3DXMATRIX rotationMatrix2;
D3DXMATRIX translationMatrix;
D3DXMATRIX scalingMatrix;
D3DVIEWPORT9 mainViewport; // 保存原来视角的副本
m_pDevice->GetViewport( &mainViewport );
D3DXMatrixRotationZ( &rotationMatrix1, (float)GetTickCount( ) / 1000.0f );
D3DXMatrixRotationZ( &rotationMatrix2, -(float)GetTickCount( ) / 1000.0f );
D3DXMatrixTranslation( &translationMatrix, 0.0f, 0.0f, 0.0f ); // 更改第一个浮点数会出现不同的效果!试试看。
D3DXMatrixScaling( &scalingMatrix, 1.0f, 0.5f, 1.0f );
m_pDevice->SetViewport( &m_RViewport );// 左上角图形
m_WorldMatrix = rotationMatrix1;
m_pDevice->SetTransform( D3DTS_WORLD, &m_WorldMatrix );
m_pDevice->DrawPrimitive( D3DPT_POINTLIST, 0, NUM_VERTICES );
m_pDevice->SetViewport( &m_SRTViewport );// 右上角图形
m_WorldMatrix = translationMatrix * rotationMatrix1 * scalingMatrix;
m_pDevice->SetTransform( D3DTS_WORLD, &m_WorldMatrix );
m_pDevice->DrawPrimitive( D3DPT_POINTLIST, 0, NUM_VERTICES );
m_pDevice->SetViewport( &m_TRViewport );// 左下角图形
m_WorldMatrix = rotationMatrix1 * translationMatrix;
m_pDevice->SetTransform( D3DTS_WORLD, &m_WorldMatrix );
m_pDevice->DrawPrimitive( D3DPT_POINTLIST, 0, NUM_VERTICES );
m_pDevice->SetViewport( &m_RTRSViewport );// 右下角图形
m_WorldMatrix = scalingMatrix * rotationMatrix2 * translationMatrix * rotationMatrix1;
m_pDevice->SetTransform( D3DTS_WORLD, &m_WorldMatrix );
m_pDevice->DrawPrimitive( D3DPT_POINTLIST, 0, NUM_VERTICES );
m_pDevice->SetViewport( &mainViewport );// 还原原来的视角
}
void CGameStart::InitializeViewport( void ) // 初始化视角
{
D3DVIEWPORT9 mainViewport;
m_pDevice->GetViewport( &mainViewport );
// 为一些视角赋值
m_RViewport.Width = m_SRTViewport.Width = m_TRViewport.Width = m_RTRSViewport.Width = mainViewport.Width / 2;
m_RViewport.Height = m_SRTViewport.Height = m_TRViewport.Height = m_RTRSViewport.Height = mainViewport.Height / 2;
m_RViewport.Y = m_SRTViewport.Y = 0;
m_RViewport.X = m_TRViewport.X = 0;
m_TRViewport.Y = m_RTRSViewport.Y = mainViewport.Height / 2;
m_SRTViewport.X = m_RTRSViewport.X = mainViewport.Width / 2;
m_RViewport.MinZ = m_SRTViewport.MinZ = m_TRViewport.MinZ = m_RTRSViewport.MinZ = 0.0f;
m_RViewport.MaxZ = m_SRTViewport.MaxZ = m_TRViewport.MaxZ = m_RTRSViewport.MaxZ = 1.0f;
}
要下载程序的代码,请点击下方:

分享到:
相关推荐
而且我在看《Real Time Rendering》这本书受到了很多启发。使用类MFC的开发模式可以很好的提高开发的效率。好了,接下来介绍的是我最近在钻研的矩阵变换的问题。 在游戏中一般有三个矩阵:视角矩阵、世界矩阵和...
《Real-Time Rendering 3rd》 是一本在计算机图形学领域极具权威性的著作,专注于实时渲染技术。这本书由 Tomas Akenine-Möller、Erik Reinhard 和 Naty Hoffman 联合编写,提供了关于如何在有限计算资源下实现高...
以上都是在"Real-time Rendering Tricks and Techniques in DirectX"这个主题下可能涵盖的一些关键概念。通过深入理解和应用这些技术,开发者能够构建出流畅、高质量的实时渲染应用程序。在压缩包中的"bookcode"文件...
《Real Time Rendering》是一本权威的专著,深入探讨了实时渲染的各种算法和技术。在这个项目中,你分享的是自己根据书中的理论实现的矩阵操作演示程序。矩阵在3D图形处理中扮演着至关重要的角色,因为它们可以用来...
6. **着色器设计**:涵盖从经典的固定管线到现代的GPU编程,如GLSL、 HLSL,以及基于物理的渲染(PBR),让开发者理解如何编写高效的着色器代码。 7. **实时计算和性能优化**:书中还涵盖了GPU架构的理解、并行计算...
2. **光栅化与像素操作**:光栅化是将几何数据转化为屏幕像素的过程,而像素着色器则在像素级别进行计算,实现复杂的光照效果。书中详细阐述了这些技术,包括半透明处理、深度缓冲、模板测试等。 3. **硬件加速**:...
《实时三维渲染:DirectX与...本书作为高清带完整书签的版本,对每个主题都会提供详尽的解释和示例代码,方便读者学习和查阅。无论是初学者还是有经验的开发者,都能从中受益,提升自己在实时3D渲染领域的专业技能。
《实时光线渲染》第二版是一本针对3D游戏开发人员至关重要的专业书籍,中文名为“实时图形渲染”。这本书深入探讨了如何在实时环境中...书中的实例和代码示例对于实践学习尤为宝贵,帮助读者将理论知识应用于实际项目。
《实时渲染第二部分》是关于计算机图形学领域中实时渲染技术的深入探讨。这个压缩包包含了一系列关于实时渲染核心技术的PDF文档,分别是“第...学习并掌握这些内容,能帮助开发者创建出更加逼真和流畅的实时图形体验。
《Real-Time_3D_Rendering_with_DirectX_and_HLSL》是一本专注于实时三维渲染技术的专著,尤其强调了DirectX和High-Level Shading Language(HLSL)的应用。这本书是为那些想要深入理解现代游戏开发、虚拟现实、可视...
《OpenGL Lighting Techniques For Real-Time 3D Rendering》一书深入浅出地介绍了在OpenGL框架下实现实时光照渲染的技术细节,为初学者提供了一个入门级的指南。尽管书中内容可能不算深度,但对于理解OpenGL如何...
《Real-Time Rendering 3rd》是计算机图形学领域的一本权威著作,专注于实时渲染技术,对游戏开发、虚拟现实、视觉特效等领域具有深远影响。实时渲染与传统的离线渲染不同,它强调在有限的时间内完成高质量的图像...
### 实时渲染(Real-Time Rendering) #### 知识点一:实时渲染技术概览 - **定义**:实时渲染是一种计算机图形学中的技术,用于在有限时间内生成图像,并且能够实时响应用户输入或环境变化。它广泛应用于视频游戏...
- Alan Watt 和 Fabio Policarpo 的两本著作:《3D Games: Real-Time Rendering and Software Technology》(2001年)以及《3D Games: Animation and Advanced Real-Time Rendering》(2003年),均由Addison ...
《实时渲染》(Real-Time Rendering, Third Edition)是计算机图形学领域的一本经典著作,主要关注如何在有限的时间内高效地生成高质量的图像。实时渲染技术广泛应用于游戏、虚拟现实、增强现实、可视化等多个领域。...
这份文档《Real-Time-Rendering+Tricks+and+Techniques+in+DX.doc》应该详细介绍了上述技术,并可能包含实际代码示例、性能优化策略以及具体应用场景。通过学习和实践这些技巧,开发者可以提升其在实时渲染领域的...