VB6编程:DirectX 2D图形学习日志9对4-6课的总结
教程下载地址:https://download.csdn.net/download/gosub60/13696651

第6课创建顶点缓冲区,重点内容如下:
**一 顶点缓冲区:**在2D或3D的游戏里,物体模型是用多边形网格来描述的,一般的是三角形,顶点缓冲区就是来存储用来描述物体模型的所有多面形的顶点的信息,这些信息有顶点的三维坐标,顶点颜色,顶点法向量,纹理坐标等。
二使用顶点缓存分为四步:
1.需要定义一个顶点格式类型,用来说明你的顶点中有哪些信息,在4-6课中,顶点类型是这样定义的:灵活顶点格式 ( Flexible Vertex Format )FVF
'2D(已转换和已点亮)顶点格式类型。
Private Type TLVERTEX
X As Single'屏幕位置坐标X
Y As Single'屏幕位置坐标y
Z As Single''屏幕位置坐标Z
RHW As Single'RHW是顶点在投影空间中存在的齐次点(x,y,z,w)的W坐标的倒数。
Color As Long'顶点颜色
Specular As Long'镜面高光
TU As Single'纹理坐标
TV As Single'纹理坐标
End Type
TLVertex类型介绍更多的信息请参考官方说明文档。
上述声明了一个有效的经过变换和光照的顶点,该顶点具有漫反射和镜面反射的顶点颜色,以及一组纹理坐标。x和y值必须在屏幕坐标中,并且z必须是要在z缓冲区中使用的像素的深度值。Z值的范围可以从0.0到1.0,其中0.0是距离用户最近的位置,而1.0是在查看区域内仍可见的最远位置。紧随该位置之后,变换后的顶点和照亮的顶点必须包括均等W(RHW)值的倒数。RHW是顶点在投影空间中存在的齐次点(x,y,z,w)的W坐标的倒数。该值通常是沿着Z轴的从视点到顶点的距离。
顶点结构完成后,我们需要描述通过结合使用灵活顶点格式(FVF)标志来格式化顶点的方式。
'2D(转换和点亮)顶点格式。
'此顶点的顶点格式描述为
'(D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1)
Private Const FVF_TLVERTEX As Long = D3DFVF_XYZRHW Or D3DFVF_TEX1 Or D3DFVF_DIFFUSE Or D3DFVF_SPECULAR
常用的灵活顶点格式的取值及含义如下:
D3DFVF_XYZ——顶点的三维坐标(分别代表X,Y,Z坐标),表示有位置,而且需要进行矩阵变换(世界,投影,视口,取景)和设置摄像机位置才能在屏幕上显示;
D3DFVF_XYZRHW——即平时所说rhw,它说明顶点有位置,而且经过了矩阵变换,不用再由Direct3D对它进行变换,通常用于做UI(用户界面);
D3DFVF_DIFFUSE——表示顶点格式中有漫反射颜色(这涉及到顶点数据格式的设置),同时,必须开启了光照才能看到设置的颜色,否则是本色(一般是白色)的;
D3DFVF_NORMAL——表示顶点有法线向量;
D3DFVF_TEX*——表示顶点有纹理坐标,*可以是1至8,表示有多少套纹理坐标
D3DMFVF_SPECULAR——顶点包含一个32位ARGB颜色值,用作其镜面反射颜色值。
2.创建顶点缓存:使用的函数是 CreateVertexBuffer,函数原型c++代码:
HRESULT IDirect3DDevice9::CreateVertexBuffer(
UINT Length, //顶点缓冲区的大小
DWORD Usage, //顶点缓冲区的用法
DWORD FVF, //可变的顶点格式(灵活顶点格式)
D3DPOOL Pool, //顶点缓冲区所使用的内存池类型
IDirect3DVertexBuffer9** ppVertexBuffer, //顶点缓冲区的指针
HANDLE* pSharedHandle //保留字,设置为NULL
); //创建顶点缓冲区
相关参数介绍一下:
参数1:Length(顶点缓冲区的大小),以字节为单位。对于灵活的顶点格式(FVF)顶点缓冲区,Length必须足够大以包含至少一个顶点,并且必须是顶点大小的倍数。
参数2:Usage(顶点缓冲区的用法),来自D3DMUSAGE值的以下一个或多个标志的组合,描述此资源的用法控件。
参数3:FVF(灵活顶点格式),组合灵活顶点格式(FVF)标志,这是一个使用说明符,用于描述此缓冲区中顶点的顶点格式。当此参数设置为有效的FVF代码时,创建的顶点缓冲区是FVF顶点缓冲区。否则,呼叫将失败。
参数4:Pool(顶点缓冲区所使用的内存池类型)属于枚举类型D3DPOOL,用于指定顶点缓冲区内存类型,D3DPOOL_MANAGED代表当前存储空间受系统管理,自动分配。
参数5:ppVertexBuffer(顶点缓冲区的指针)指向IDirect3DMobileVertexBuffer是一个指向创建的顶点缓冲区地址的指针,用于返回顶点缓冲区的地址。
参数6:pSharedHandle是一个保留参数,可设置为NULL。
注意:D3DFVF_XYZ默认的用户区中心坐标是(0,0),而D3DFVF_XYZRHW是左上角为(0,0)
用D3DFVF_XYZ默认的为非光照的,而D3DFVF_XYZRHW是高洛德光照。
在4-6课中,对于 创建顶点缓存 是这样运用的。
'创建顶点缓冲区。
Set Vertex_Buffer = Direct3D_Device.CreateVertexBuffer(Len(Vertex_List(0)) * 4, 0, FVF_TLVERTEX, D3DPOOL_MANAGED)
D3DVertexBuffer8SetData Vertex_Buffer, 0, Len(Vertex_List(0)) * 4, 0, Vertex_List(0)
- 访问顶点缓存
函数 访问之前需要先把顶点缓存的内存锁住,然后读写数据,然后解锁。(4-6课暂时没讲这些,后边有讲,在此只记录一下)
一般流程就是
//设置顶点数据
//填充顶点缓冲区
4.绘制图形,一般分3小步(4-6课暂时没讲这些,后边有讲,在此只记录一下)
①设置数据源 :此方法将顶点缓冲区绑定到设备数据流。
函数 SetStreamSource
```vbnet
设置顶点缓冲区的流源。
Direct3D_Device.SetStreamSource 0, Vertex_Buffer, Len(Vertex_List(0))
②设置定点格式:
函数 SetFVF
Direct3D_Device.SetVertexShader FVF_TLVERTEX '设置顶点着色的类型。 (需要)
③绘制图形
函数 DrawPrimitive
```vbnet
Direct3D_Device.BeginScene
'渲染代码在这里。
Direct3D_Device.DrawPrimitive D3DPT_TRIANGLESTRIP, 0, 2
Direct3D_Device.EndScene
'将后缓冲区翻转到窗体窗口中。
Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
三.第5课创建顶点颜色,重点内容如下:
①D3DColor:定义基本的Direct3D颜色类型。一个四字节(DWORD)的值,通常代表一种颜色的alpha,红色(red),绿色(green)和蓝色(blue)分量。它也可以代表亮度和亮度。(下图所示)

您可以使用以下宏之一来设置D3DCOLOR类型。
D3DCOLOR_ARGB:使用提供的alpha,红色,绿色和蓝色值初始化颜色。此值必须在0到255之间。
D3DCOLOR_AYUV:使用(a,y,u,v)值初始化颜色。此值必须在0到255之间。
D3DCOLOR_COLORVALUE:使用提供的红色,绿色,蓝色和alpha浮点值初始化颜色。与D3DCOLOR_RGBA(r,g,b,a)类似,不同的是参数都是浮点值,范围[0.0-1.0]
D3DCOLOR_RGBA:使用提供的红色,绿色,蓝色和Alpha值初始化颜色。此值必须在0到255之间。
D3DCOLOR_XRGB:使用提供的红色,绿色和蓝色值初始化颜色。Alpha值为1,三个byte分别表示红,绿,蓝
D3DCOLOR_XYUV:用(y,u,v)值初始化颜色。此值必须在0到255之间。y=颜色的亮度分量,u=颜色的蓝色亮度,v=红色的颜色亮度
②D3DCOLOR_COLORVALUE:使用提供的红色,绿色,蓝色和alpha浮点值初始化颜色。
const D3DCOLOR_COLORVALUE(r,g,b,a)
' D3DCOLOR_RGBA((DWORD)((r)*255.f),(DWORD)((g)*255.f),(DWORD)((b)*255.f),(DWORD)((a)*255.f))
③D3DXCOLOR:描述颜色值。D3DXCOLOR比D3DCOLOR更强大,它是一个类,有丰富的构造函数,多个类型转换函数,也可以方便的进行各种与颜色有关的算术运算。
Type D3DXCOLOR
r as Single'红色
g as Single'绿色
b as Single'蓝色
a as Single'Alpha
end Type
④ D3DCOLOR与D3DXCOLOR的转换:一般来说,两者基本可以互换使用
任何使用D3DCOLOR的地方可以直接使用D3DXCOLOR,因为D3DXCOLOR重载了()运算符,可以直接转换为D3DCOLOR
任何使用D3DXCOLOR的地方可以直接使用D3DCOLOR,因为D3DXCOLOR有一个构造函数以D3DCOLOR为参数
⑤颜色转换:Single(浮点)<->DWORD(四字节),在DirectX程序中有些地方用DWORD(RGBA)格式表示颜色,其范围是[0 - 255],在shader中则都以float来表示颜色,其范围是[0.0 - 1.0],两者间的转换规则如下:
DWORD -> float 将DWORD除以255
float -> DWORD 将float值乘以255
举个例子,127 / 255 = 0.5,0.1 * 255 = 25
四.第四课 创建多边形(例子当中创建了正方形)
首先定义顶点类型,然后搞了一个Create_TLVertex函数,方便设置顶点数据,然后根据顶点数据创建一个多边形。
Private Vertex_List(3) As TLVERTEX '4个顶点将构成一个正方形。
'在课程中,为了方便设置顶点信息,可以使用下边的过程进行调用:
'使用此功能可以更轻松地设置具有所需信息的顶点。
Private Function Create_TLVertex(X As Single, Y As Single, Z As Single, RHW As Single, Color As Long, Specular As Long, TU As Single, TV As Single) As TLVERTEX
Create_TLVertex.X = X
Create_TLVertex.Y = Y
Create_TLVertex.Z = Z
Create_TLVertex.RHW = RHW
Create_TLVertex.Color = Color
Create_TLVertex.Specular = Specular
Create_TLVertex.TU = TU
Create_TLVertex.TV = TV
End Function
'创建多边形。
'---------------------------------------------------------------
Vertex_List(0) = Create_TLVertex(0, 0, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 0, 0)
Vertex_List(1) = Create_TLVertex(100, 0, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 1, 0)
Vertex_List(2) = Create_TLVertex(0, 100, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 0, 1)
Vertex_List(3) = Create_TLVertex(100, 100, 0, 1, D3DColorRGBA(255, 255, 255, 0), 0, 1, 1)
'---------------------------------------------------------------
五:一些名词解释:
① SetStreamSource:作用:将顶点缓冲区绑定到设备数据流。原型如下C++:
HRESULT IDirect3DDevice9::SetStreamSource(
UINT StreamNumber, //管道流水线编号
IDirect3DVertexBuffer9* pStreamData, //顶点缓冲区指针
UINT OffsetInBytes, //缓冲区数据的偏移字节位置
UINT Stride //顶点带宽,一般为顶点结构体的字节大小
); //顶点缓冲区数据装入管道流水线
在本课中的调用如下:
'设置顶点缓冲区的流源。
Direct3D_Device.SetStreamSource 0, Vertex_Buffer, Len(Vertex_List(0))
参数解释如下:
StreamNumber:指定数据流,范围为0到最大流数-1。
pStreamData:指向IDirect3DVertexBuffer9接口的指针,该接口表示绑定到指定数据流的顶点缓冲区。(此项可以省略)
OffsetInBytes:缓冲区数据的偏移字节位置,从流的开始到顶点数据的开始的偏移量(以字节为单位)
Stride:组件的步幅(以字节为单位)
② **SetVertexShader**设置顶点着色器类型。C++原型如下:
HRESULT SetVertexShader(
IDirect3DVertexShader9 *pShader
);
在本例程序中的使用如下:
Direct3D_Device.SetVertexShader FVF_TLVERTEX '设置顶点着色的类型。 (需要)
参数说明:
pShader:类型为:IDirect3DVertexShader9 (就是前边说的顶点缓冲区数据)
③Clear:作用:清除一个或多个曲面,例如渲染目标,多个渲染目标,模板缓冲区和深度缓冲区。
函数原型如下C++源码:
HRESULT IDirect3DDevice9::Clear(
DWORD Count, //要清除的绘图表面的矩形区域个数
const D3DRECT* pRects, //所清除的绘图表面的区域
DWORD Flags, //清除标志
D3DCOLOR Color, //清除后的新颜色值
float Z, //所清除的Z-Buffer缓冲区的新Z值(0--1之间)
DWORD Stencil //所清除的Stencil缓冲区的新值
); //清除设备缓冲区数据
在本例中的应用:
'清除后缓冲区。
Direct3D_Device.Clear 0, ByVal 0, D3DCLEAR_TARGET, D3DColorRGBA(0, 0, 0, 0), 1#, 0
参数说明:
Count:pRects数组中矩形的数量。如果pRects为NULL,则必须设置为0 。如果pRects是有效的指针,则不能为0。
pRects:指向描述要清除的矩形的D3DRECT结构的数组的指针。将矩形设置为渲染目标的尺寸以清除整个表面。每个矩形使用的屏幕坐标对应于渲染目标上的点。坐标被裁剪到视口矩形的边界。若要指示要清除整个视口矩形,请将此参数设置为NULL,并将Count设置为0。
Flags:一个或多个D3DCLEAR标志的组合,这些标志指定将要清除的表面。
D3DCLEAR_STENCIL 清除模板缓冲区。
D3DCLEAR_TARGET 清除渲染目标,或清除多个渲染目标中的所有目标。
D3DCLEAR_ZBUFFER 清除深度缓冲区。
Color:将渲染目标清除为此ARGB颜色。
Z:将深度缓冲区清除为这个新的z值,范围从0到1。
Stencil:将模板缓冲区清除为这个新值,范围从0到2ⁿ-1(n是模板缓冲区的位深度)
④ BeginScene:开始一个场景。应用程序必须在执行任何渲染 之前调用IDirect3DDevice9 :: BeginScene,并且在渲染完成后以及再次调用IDirect3DDevice9 :: BeginScene之前必须调用IDirect3DDevice9 :: EndScene。
⑤ EndScene :结束通过调用IDirect3DDevice9 :: BeginScene开始的场景。此方法成功后,场景已排队等待驱动程序进行渲染。这不是同步方法,因此当此方法返回时,不能保证场景已完成渲染。
⑥Present:在设备拥有的后退缓冲区序列中显示下一个缓冲区的内容。C++原型代码如下:
HRESULT Present(
const RECT *pSourceRect, //一般说明为NULL
const RECT *pDestRect, //一般说明为NULL
HWND hDestWindowOverride, //一般说明为NULL
const RGNDATA *pDirtyRegion //一般说明为NULL
);
在本例中的运用:
'将后缓冲区翻转到窗体窗口中。
Direct3D_Device.Present ByVal 0, ByVal 0, 0, ByVal 0
668

被折叠的 条评论
为什么被折叠?



