编程语言

img starhuhu

Sample Framework 学习

发表于2008/10/1 14:27:00  443人阅读

这是在追新使用 VS 2005后又不得不回来使用VC6,VC6在98/Me XP 2k 2003上
工作的都良好,但是也有个Bug,就是在使用Dx时并不能列出组件的成员。

//-------------------------------------------------
//假设您已经安装好了DirectX SDK Summer 2003以上版本到D:/下。
Sample Framework 例子框架
Microsoft DirectX@ 9.0例子框架从DirectX 8.0图形例子框架发展。
这个软件包被安装在如下的位置上
DX90SDK/Samples/C++/Direct3D - Direct3D@例子
Dx90SDK/Samples/C++/Common  - 例子框架的头和源代码,包括图形框架。

由五类源模块组成:
D3Dapp.cpp -
D3dfile.cpp - 提供对.x文件的支持
D3dfont.cpp - 提供基本的字体输出支持
D3dutil.cpp - 提供了通用的3-D函数,像材质,光,纹理等,是相当实用的库。
Dxutil.cpp - 提供了DirectX的有用函数,像媒体,注册,时间等。
其中D3Dapp是窗口控制等的基础类。
//----------------------------------------------------
每个例子(Sample)都继承自CD3DApplication,一般SDK中都将实例命名为
CMyD3DApplication,下面是几个可以被重写的成员函数。
//Overridable functions for the 3-D scene created by the application
virtual HRESULT ConfirmDevice(D3DCAPS9*,DWORD,D3DFORMAT)   { return S_OK; }
virtual HRESULT OneTimeSceneInit()                         { return S_OK; }
virtual HRESULT InitDeviceObjects()                        { return S_OK; }
virtual HRESULT RestoreDeviceObjects()                     { return S_OK; }
virtual HRESULT FrameMove()                                { return S_OK; }
virtual HRESULT Render()                                   { return S_OK; }
virtual HRESULT InvalidateDeviceObjects()                  { return S_OK; }
virtual HRESULT DeleteDeviceObjects()                      { return S_OK; }
virtual HRESULT FinalCleanup()                             { return S_OK; }


通过在CMyApplication这样的实例中重写基类(根类,父类)的函数,
就实现了对基类任意的改造。

CD3DApplication成员函数的原形被包含在D3dapp.h的头文件中。
本例子将创建一个Direct3D应用程序并根据程序需要重写这写方法。

Derived Class Example(导出的实例)
导出的CMyD3DApplication包含下面这些方法。
class CMyD3DApplication : public CD3DApplication
{
public:
    CMyD3DApplication();
protected:
    HRESULT ConfirmDevice( D3DCAPS9*, DWORD, D3DFORMAT );
    HRESULT DeleteRestoreDeviceObjects();
    HRESULT RestoreDeviceObjects();
    HRESULT FrameMove();
    HRESULT Render();
private:
    LPDIRECT3DVERTEXBUFFER9 m_pVB;         // Vertex buffer to hold vertices
}
熟悉不使用框架的朋友会发现,在这里不用再手工初始化LPDIRECT3D9和
LPDIRECT3DDEVICE9了,因为框架已经为我们做好了。
这里我们只需要定义所需要的顶点缓冲,材质,纹理,Mesh什么的就可以使用。

Constructor 构造函数
由于重写了根类的构造函数,所以我们可以更改程序的标题,宽和高等,
是否窗口全屏等。过去使用DirectDraw的时候我们还曾为切换窗口与全屏烦恼过
。构造函数将更改窗口标题,开启深度缓冲,初始化顶点缓冲。
//但是在深度缓冲下的显示我还没能使图形有颜色。
窗口标题是一个宽字符串将显示在标题栏上或在程序加载时的窗口类。它是任意
的。
默认是关闭深度缓冲的,在这里开启。
FrameMove 将允许你重写它以生成动画,这对学习D3D很有帮助。
在使用手工方式下,除了Render我们似乎还找不到分离动画于静态渲染的方法。
微软程序员给了这种形式,当然还有其他形式。
这这里我们仅根据Dx文档知道了Sample Framework使用的基本状况,更令人
兴奋的还在后面,真令人期待啊。

为了呈现图形以填充缓冲区
g_Vertices我们需要自己定义,灵活顶点格式(FVF)也需要自己定义。
这里我定义的是
struct CUSTOMVERTEX
{
   FLOAT x,y,z;
   DWORD color;
};
顶点格式是 D3DFVF_XYZ|D3DFVF_DIFFUSE
关闭了光照。由于DirectX8和Dx9有些不同
创建顶点缓冲区在9里最后一个参数置NULL
CreateVertexBuffer
另外
SetStreamSource也要多设置个0
SetStreamSource(0,m_pVB,0,sizeof(CUSTOMVERTEX));
DirectX虽然不像OpenGL那样是跨平台,标准化的,但是
DirectX发展的很快,函数支持的也很广泛。功能上更完整。
DirectX Summer 2003中Direct3D的例子共有将近40个左右的例子。
充分的参考这些例子可以很快出效果,但是相关图形学还是有必要掌握的。
在郁闷了很久之后似乎找到了点希望。

目标 - 游戏

API - DirectX OpenGL 理论 计算机图形学

Windows游戏编程书籍

《Windows游戏编程大师技巧》
《3D游戏编程大师技巧》
《3D游戏:卷2动画与高级实时渲染技术》
《3D游戏:卷1 实时渲染与软件技术》
《Direct3D中的2D编程》
《Direct3D游戏编程入门教程》
《Visual C++角色扮演游戏程序设计》
《游戏核心算法编程内幕》
《学VC编游戏》
《实时计算机图形学》
《游戏编程精粹系列》
《DirectX 9.0 3D图形程序设计》
《PC游戏编程系列》
 《3D数学基础:图形与游戏开发》
 《3D.Game.Engine.Programming》
  《图形图像编程精粹》
 《GPU精粹:实时图形标称的技术、技巧和技艺》
 《计算机图形学的算法基础》
  《Windows游戏编程超级秘籍 Tricks of the Windows Game Programming Gurus》
《Dx9高级3D游戏编程 Advanced 3D Game Programming With DirectX9》
 《Programming Vertex and Pixel Shaders》
《Shaderx2 - Shader Programming Tips & Tricks With DirectX 9》
 《高级DirectX动画编程 Advanced Animation with DirectX》
《dot Net Game Programming With DirectX 9.0》
 《游戏编程大师2之Windows编程模型》
 《3D GameEngine Programming》
 《VeryCD 游戏编程集锦》

//----------------------------------------
Visual C++图形编程技巧与实例
《计算机图形学原理及算法教程(Visual C++版)》

这些图形书应该都是推荐的,从高级到入门都有,列了这么多,
我也没看完几本,《Direct3D游戏编程入门教程》这本书是我计划要认真
看的。

阅读全文
0 0

相关文章推荐

img
取 消
img