VB6.0使用DIRECTX8 3d编程资料
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
下面来分析程序:
先看模块的声明部分,声明了三个模块级变量,为了在以后的程序中能够一眼看出变量类型,我的命名采用“My+变量类型”的原则。
第一个变量在声明类型的同时还创建了一个DirectX8对象(由New关键字可见),而后两个变量仅仅是声明类型而已,并没有新的对象被创建。
到了Form_Load事件里的这一句:
才创建了一个Direct3DDevice8对象并让 MyDirect3DDevice8 指向它。
让我们来再看一下这三句来理顺这三个对象之间的关系:
Private MyDirectX8 As New DirectX8
Set MyDirect3D8 = MyDirectX8.Direct3DCreate
Direct3D8:这个类用来创建 Direct3D 对象和设置环境,程序中用了它的CreateDevice方法来创建设备,用了它的 GetAdapterDisplayMode 方法来获取显卡的显示模式。
Direct3DDevice8:这是D3D中最重要的类了,鼠标、纹理、图元、材质、灯光、缓冲区、阴影、渲染场景都由它来完成,前面的两个类只是初始化时用到一下而已,后面的程序中全部都是 Direct3DDevice8 的方法,例如:SetCursorPosition、ShowCursor、CreateIndexBuffer、CreateTexture、CreateVertexBuffer、SetRenderState、SetTransform、SetIndices、GetLight、SetMaterial、Present、Reset、DrawPrimitive、BeginScene、EndScene、Clear…… 从名字就可大致看出它们的功能。
Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(...)
首先创建Mt3D8 对象,最后由 MyDirect3D8 来创建 MyDirect3DDevice8 对象,简写为:
DirectX8 -> Direct3D -> Direct3DDevice
Width As Long
Height As Long
RefreshRate As Long
End Type
后面三个参数很好理解,和Windows的显示属性对话框里的是一致的,可是第一个参数是什么呢?关键在于 CONST_D3DFORMAT 是什么。CONST_D3DFORMAT 是这样的枚举类型:
Enum CONST_D3DFORMAT
D3DFMT_UNKNOWN = 0
D3DFMT_R8G8B8 = 20 (&H14)
D3DFMT_A8R8G8B8 = 21 (&H15)
D3DFMT_X8R8G8B8 = 22 (&H16)
D3DFMT_R5G6B5 = 23 (&H17)
……
End Enum
显然从左往右是整体和部分之间的关系(例如 Direct3D 是 DirectX8 的一个组件等等),这样够清楚了吧?
为了更深刻地理解VB里的对象、对象指针、Set、New这些概念(语句),我们来看看VC++里是怎么写的:
1.LPDIRECT3D8 MyDirect3D8 = NULL;
2.LPDIRECT3DDEVICE8 MyDirect3DDevice8 = NULL;
Type D3DPRESENT_PARAMETERS
AutoDepthStencilFormat As CONST_D3DFORMAT
请大家首先动手完成以下步骤:
1. 新建一个标准的exe工程;
2. 在窗体上放一个Timer控件,设置Enabled=False,Interval=200;
3. 选择菜单“工程(Project) -> 引用(Reference)”,然后找到“DirectX 8 for Visual Basic Type Library”打勾,确定;
把对象的创建和它们之间的关系弄清楚后,让我们来逐个看看各个对象吧。
DirectX8:DirectX8 类是使用微软 DX 技术的起点,编写任何DX程序都由它开始,在程序中,我们用它的 Direct3DCreate 方法来创建一个 Direct3D 对象,其实它还有DirectInputCreate、DirectMusicComposerCreate、DirectPlayClientCreate、DirectSoundCreate、DirectXFileCreate等方法来创建其他的DX对象。
下面让我们来看一下Form_Load事件里的两个变量类型:D3DDISPLAYMODE 和 D3DPRESENT_PARAMETERS,它们都是结构体类型。顾名思义,D3DDISPLAYMODE 是用来描述显示模式的:
Type D3DDISPLAYMODE
Format As CONST_D3DFORMAT
其中变量类型前缀LP是 Long Pointer(32位指针)的意思,
LPDIRECT3D8 MyDirect3D8 等价于 DIRECT3D8* MyDirect3D8,
MyDirect3D8是指向 DIRECT3D8 对象的指针类型。
首先定义了两个指针 MyDirect3D8、MyDirect3DDevice8 分别指向 DIRECT3D8 和 DIRECT3DDEVICE8 对象,然后用函数 Direct3DCreate8 创建 DIRECT3D8 对象(当然该函数返回的是指向该对象的指针),赋值给MyDirect3D8,然后用 MyDirect3D8 指向的 Direct3D8 对象的 CreateDevice 方法创建 Direct3DDevice8 对象,并将其地址以传址方式传给 MyDirect3DDevice8。
D3DFMT_R5G6B5:16位RGB格式。5+6+5=16.
好,这样结构体 D3DDISPLAYMODE 我们就理解了,里面存放的是屏幕的宽、高、刷新率和颜色空间。下来我们再来看结构体D3DPRESENT_PARAMETERS。这里面包含了一个重要的单词(概念):Present。它既不是“礼物”,也不是“现在的”,也不是“介绍,引见”,而是“呈现,展现”的意思。我们在计算机构建了3D场景后,最终要在显示器上显示出来,这个3D变2D,矢量变点阵的过程就叫做:Present,展现。好了,下面看看它的定义:
3.
4.MyDirect3D8 = Direct3DCreate8( D3D_SDK_VERSION );
5.MyDirect3D8->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &MyDirect3DDevice8)
21.Timer1.Enabled = True
22.End Sub
23.
24.Private Sub Timer1_Timer()
25.Const WORLD_COLOR As Long = &HFF00&
26.
27.With MyDirect3DDevice8
28..Clear 0, ByVal 0, D3DCLEAR_TARGET, WORLD_COLOR, 1#, 0
首先选择一下各个工具的版本。VB我选择VB6,一是它速度比较快,二是我对它比较熟悉。然后由于VB6只含有DX7和DX8的函数库,因此对于DX版本的选择嘛,我就选用它所支持的最高版本DX8啦。常用的3D建模软件有3ds max和Maya,我个人觉得Maya的性能较好,而Maya导出X文件的插件能用于D3D中的最高版本是Maya 6(Maya 7虽然导出的X文件能在mesh viewer里查看,但是导入D3D后不正常),因此我选用Maya 6.
13.
14.With d3dpp
15..Windowed = 1
16..SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
17..BackBufferFormat = DispMode.Format
18.End With
19.
20.Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
29..BeginScene
30..EndScene
31..Present ByVal 0, ByVal 0, 0, ByVal 0
32.End With
33.End Sub
运行。如果看见一个绿色的窗体的话,那么恭喜你,你已经编写了一个真正的D3D程序!
这个程序很简单,但它的确是一个完整的D3D程序。
4. 在窗体内输入如下代码:
1.Option Explicit
2.
3.Private MyDirectX8 As New DirectX8
4.Private MyDirect3D8 As Direct3D8
5.Private MyDirect3DDevice8 As Direct3DDevice8
6.
与VB程序最大的不同是没有DirectX8对象,不像VB那样用 MyDirectX8.Direct3DCreate 来创建Direct3D8对象,而直接使用库函数Direct3DCreate8来创建(而且多了个参数D3D_SDK_VERSION)。第二个不同是VB里 MyDirect3DDevice8 的赋值是通过函数的返回值的方式,而VC里则是通过参数传址的方式赋值。
学习D3D,在软件方面需要一些类的知识,在数学方面需要一些向量代数、空间解析几何、矩阵的知识;对缺乏这些知识的初学者来说学习起来可能比较困难,如果实在看不懂,建议还是自己先补一下基础知识吧。不过请千万别灰心,想一想,能够随自己的意愿来设计3D游戏是多么激动人心的事情啊!请用这个目标来激励自己吧!
下面让我们通过一个最简单的D3D的程序来开始讲解一些基本的DX和D3D概念:
7.Private Sub Form_Load()
8.Dim DispMode As D3DDISPLAYMODE
9.Dim d3dpp As D3DPRESENT_PARAMETERS
10.
11.Set MyDirect3D8 = MyDirectX8.Direct3DCreate
12.MyDirect3D8.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode
常用的3d建模软件有3dsmax和maya我个人觉得maya的性能较好而maya导出x文件的插件能用于d3d中的最高版本是maya6maya虽然导出的x文件能在meshviewer里查看但是导入d3d后不正常因此我选用maya学习d3d在软件方面需要一些类的知识在数学方面需要一些向量代数空间解析几何矩阵的知识
你是否曾惊叹VB的简单易用与开发的速度之快?你是否对编写二维的游戏早已感到厌倦和无聊?你是否想有朝一日自己也能写出魔兽、CS、起义、古墓丽影……之类的3D游戏?你是否想过利用D3D甚至可以把你去过的旅游景点或你的家这些场景在电脑中构造出来,然后加入自己的创意、故事和情节搞点什么东西?你是否想过利用D3D可以构造你的岛屿、你的天堂,把你在现实世界中无法实现的梦想在虚拟世界中实现,或者预先把你的梦想可视化以便更快速地实现它?那么还犹豫什么?!让我们开始一趟激动人心的D3D学习之旅吧!
为简明起见,以上只列出了几种常见的取值,理解概念即可。
D3DFMT_UNKNOWN:顾名思义,未知格式。
D3DFMT_R8G8B8:24位RGB 格式,R、G、B分别占8位。
D3DFMT_A8R8G8B8:32位ARGB格式,A表示alpha.
D3DFMT_X8R8G8B8:32位RGB格式,X8是保留的8位,未来可以根据情况灵活地分配给R、G、B。
Set MyDirect3D8 = MyDirectX8.Direct3DCreate
才创建了一个Direct3D8对象并让MyDirect3D8指向它,到这一句:
Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
先看模块的声明部分,声明了三个模块级变量,为了在以后的程序中能够一眼看出变量类型,我的命名采用“My+变量类型”的原则。
第一个变量在声明类型的同时还创建了一个DirectX8对象(由New关键字可见),而后两个变量仅仅是声明类型而已,并没有新的对象被创建。
到了Form_Load事件里的这一句:
才创建了一个Direct3DDevice8对象并让 MyDirect3DDevice8 指向它。
让我们来再看一下这三句来理顺这三个对象之间的关系:
Private MyDirectX8 As New DirectX8
Set MyDirect3D8 = MyDirectX8.Direct3DCreate
Direct3D8:这个类用来创建 Direct3D 对象和设置环境,程序中用了它的CreateDevice方法来创建设备,用了它的 GetAdapterDisplayMode 方法来获取显卡的显示模式。
Direct3DDevice8:这是D3D中最重要的类了,鼠标、纹理、图元、材质、灯光、缓冲区、阴影、渲染场景都由它来完成,前面的两个类只是初始化时用到一下而已,后面的程序中全部都是 Direct3DDevice8 的方法,例如:SetCursorPosition、ShowCursor、CreateIndexBuffer、CreateTexture、CreateVertexBuffer、SetRenderState、SetTransform、SetIndices、GetLight、SetMaterial、Present、Reset、DrawPrimitive、BeginScene、EndScene、Clear…… 从名字就可大致看出它们的功能。
Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(...)
首先创建Mt3D8 对象,最后由 MyDirect3D8 来创建 MyDirect3DDevice8 对象,简写为:
DirectX8 -> Direct3D -> Direct3DDevice
Width As Long
Height As Long
RefreshRate As Long
End Type
后面三个参数很好理解,和Windows的显示属性对话框里的是一致的,可是第一个参数是什么呢?关键在于 CONST_D3DFORMAT 是什么。CONST_D3DFORMAT 是这样的枚举类型:
Enum CONST_D3DFORMAT
D3DFMT_UNKNOWN = 0
D3DFMT_R8G8B8 = 20 (&H14)
D3DFMT_A8R8G8B8 = 21 (&H15)
D3DFMT_X8R8G8B8 = 22 (&H16)
D3DFMT_R5G6B5 = 23 (&H17)
……
End Enum
显然从左往右是整体和部分之间的关系(例如 Direct3D 是 DirectX8 的一个组件等等),这样够清楚了吧?
为了更深刻地理解VB里的对象、对象指针、Set、New这些概念(语句),我们来看看VC++里是怎么写的:
1.LPDIRECT3D8 MyDirect3D8 = NULL;
2.LPDIRECT3DDEVICE8 MyDirect3DDevice8 = NULL;
Type D3DPRESENT_PARAMETERS
AutoDepthStencilFormat As CONST_D3DFORMAT
请大家首先动手完成以下步骤:
1. 新建一个标准的exe工程;
2. 在窗体上放一个Timer控件,设置Enabled=False,Interval=200;
3. 选择菜单“工程(Project) -> 引用(Reference)”,然后找到“DirectX 8 for Visual Basic Type Library”打勾,确定;
把对象的创建和它们之间的关系弄清楚后,让我们来逐个看看各个对象吧。
DirectX8:DirectX8 类是使用微软 DX 技术的起点,编写任何DX程序都由它开始,在程序中,我们用它的 Direct3DCreate 方法来创建一个 Direct3D 对象,其实它还有DirectInputCreate、DirectMusicComposerCreate、DirectPlayClientCreate、DirectSoundCreate、DirectXFileCreate等方法来创建其他的DX对象。
下面让我们来看一下Form_Load事件里的两个变量类型:D3DDISPLAYMODE 和 D3DPRESENT_PARAMETERS,它们都是结构体类型。顾名思义,D3DDISPLAYMODE 是用来描述显示模式的:
Type D3DDISPLAYMODE
Format As CONST_D3DFORMAT
其中变量类型前缀LP是 Long Pointer(32位指针)的意思,
LPDIRECT3D8 MyDirect3D8 等价于 DIRECT3D8* MyDirect3D8,
MyDirect3D8是指向 DIRECT3D8 对象的指针类型。
首先定义了两个指针 MyDirect3D8、MyDirect3DDevice8 分别指向 DIRECT3D8 和 DIRECT3DDEVICE8 对象,然后用函数 Direct3DCreate8 创建 DIRECT3D8 对象(当然该函数返回的是指向该对象的指针),赋值给MyDirect3D8,然后用 MyDirect3D8 指向的 Direct3D8 对象的 CreateDevice 方法创建 Direct3DDevice8 对象,并将其地址以传址方式传给 MyDirect3DDevice8。
D3DFMT_R5G6B5:16位RGB格式。5+6+5=16.
好,这样结构体 D3DDISPLAYMODE 我们就理解了,里面存放的是屏幕的宽、高、刷新率和颜色空间。下来我们再来看结构体D3DPRESENT_PARAMETERS。这里面包含了一个重要的单词(概念):Present。它既不是“礼物”,也不是“现在的”,也不是“介绍,引见”,而是“呈现,展现”的意思。我们在计算机构建了3D场景后,最终要在显示器上显示出来,这个3D变2D,矢量变点阵的过程就叫做:Present,展现。好了,下面看看它的定义:
3.
4.MyDirect3D8 = Direct3DCreate8( D3D_SDK_VERSION );
5.MyDirect3D8->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &MyDirect3DDevice8)
21.Timer1.Enabled = True
22.End Sub
23.
24.Private Sub Timer1_Timer()
25.Const WORLD_COLOR As Long = &HFF00&
26.
27.With MyDirect3DDevice8
28..Clear 0, ByVal 0, D3DCLEAR_TARGET, WORLD_COLOR, 1#, 0
首先选择一下各个工具的版本。VB我选择VB6,一是它速度比较快,二是我对它比较熟悉。然后由于VB6只含有DX7和DX8的函数库,因此对于DX版本的选择嘛,我就选用它所支持的最高版本DX8啦。常用的3D建模软件有3ds max和Maya,我个人觉得Maya的性能较好,而Maya导出X文件的插件能用于D3D中的最高版本是Maya 6(Maya 7虽然导出的X文件能在mesh viewer里查看,但是导入D3D后不正常),因此我选用Maya 6.
13.
14.With d3dpp
15..Windowed = 1
16..SwapEffect = D3DSWAPEFFECT_COPY_VSYNC
17..BackBufferFormat = DispMode.Format
18.End With
19.
20.Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)
29..BeginScene
30..EndScene
31..Present ByVal 0, ByVal 0, 0, ByVal 0
32.End With
33.End Sub
运行。如果看见一个绿色的窗体的话,那么恭喜你,你已经编写了一个真正的D3D程序!
这个程序很简单,但它的确是一个完整的D3D程序。
4. 在窗体内输入如下代码:
1.Option Explicit
2.
3.Private MyDirectX8 As New DirectX8
4.Private MyDirect3D8 As Direct3D8
5.Private MyDirect3DDevice8 As Direct3DDevice8
6.
与VB程序最大的不同是没有DirectX8对象,不像VB那样用 MyDirectX8.Direct3DCreate 来创建Direct3D8对象,而直接使用库函数Direct3DCreate8来创建(而且多了个参数D3D_SDK_VERSION)。第二个不同是VB里 MyDirect3DDevice8 的赋值是通过函数的返回值的方式,而VC里则是通过参数传址的方式赋值。
学习D3D,在软件方面需要一些类的知识,在数学方面需要一些向量代数、空间解析几何、矩阵的知识;对缺乏这些知识的初学者来说学习起来可能比较困难,如果实在看不懂,建议还是自己先补一下基础知识吧。不过请千万别灰心,想一想,能够随自己的意愿来设计3D游戏是多么激动人心的事情啊!请用这个目标来激励自己吧!
下面让我们通过一个最简单的D3D的程序来开始讲解一些基本的DX和D3D概念:
7.Private Sub Form_Load()
8.Dim DispMode As D3DDISPLAYMODE
9.Dim d3dpp As D3DPRESENT_PARAMETERS
10.
11.Set MyDirect3D8 = MyDirectX8.Direct3DCreate
12.MyDirect3D8.GetAdapterDisplayMode D3DADAPTER_DEFAULT, DispMode
常用的3d建模软件有3dsmax和maya我个人觉得maya的性能较好而maya导出x文件的插件能用于d3d中的最高版本是maya6maya虽然导出的x文件能在meshviewer里查看但是导入d3d后不正常因此我选用maya学习d3d在软件方面需要一些类的知识在数学方面需要一些向量代数空间解析几何矩阵的知识
你是否曾惊叹VB的简单易用与开发的速度之快?你是否对编写二维的游戏早已感到厌倦和无聊?你是否想有朝一日自己也能写出魔兽、CS、起义、古墓丽影……之类的3D游戏?你是否想过利用D3D甚至可以把你去过的旅游景点或你的家这些场景在电脑中构造出来,然后加入自己的创意、故事和情节搞点什么东西?你是否想过利用D3D可以构造你的岛屿、你的天堂,把你在现实世界中无法实现的梦想在虚拟世界中实现,或者预先把你的梦想可视化以便更快速地实现它?那么还犹豫什么?!让我们开始一趟激动人心的D3D学习之旅吧!
为简明起见,以上只列出了几种常见的取值,理解概念即可。
D3DFMT_UNKNOWN:顾名思义,未知格式。
D3DFMT_R8G8B8:24位RGB 格式,R、G、B分别占8位。
D3DFMT_A8R8G8B8:32位ARGB格式,A表示alpha.
D3DFMT_X8R8G8B8:32位RGB格式,X8是保留的8位,未来可以根据情况灵活地分配给R、G、B。
Set MyDirect3D8 = MyDirectX8.Direct3DCreate
才创建了一个Direct3D8对象并让MyDirect3D8指向它,到这一句:
Set MyDirect3DDevice8 = MyDirect3D8.CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, Me.hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, d3dpp)