CreateVertexDeclaration,SetStreamSource之间的关系

SetStreamSource将一个vertex buffer与一个stream绑定,

比如

// Bind vertex buffers to device data streams

m_pd3dDevice->SetStreamSource(0, m_pVtxBuf0, 0, sizeof(VTXSTREAM_0));

m_pd3dDevice->SetStreamSource(1, m_pVtxBuf1, 0, sizeof(VTXSTREAM_1));
将m_pVtxBuf0与stream 0绑定,将m_pVtxBuf1与stream 1绑定。


我们知道一个vertex buffer里存储的是各种各样的顶点数据。

d3d绘制物体时,从vertex buffer(或者说stream)里获取这些数据之后,如何知道这些数据的用途?

比如说,我们从stream 0获取了(x,y,z),想让它表示物体的顶点位置,如何实现?

实际上,对顶点的用途描述是通过CreateVertexDeclaration,SetVertexDeclaration来实现的。

用CreateVertexDeclaration创建一个顶点声明,这个声明用来描述某个stream中的数据是用来干嘛用的。因为只是一种描述,与具体的顶点无关,所以可以重复使用。

实际这个用这个声明来描述stream(vertex buffer)中的数据,是通过SetVertexDeclaration来实现的。


CreateVertexDeclaration是如何描述顶点数据用途的?

通过一个D3DVERTEXELEMENT9数组,数组中的每一个元素,描述了某个顶点属性,所在的stream,所在stream中的位置,用途,类型等。


也就是说使用DrawPrimitive等方法从stream中读取数据时,以下面代码为例,

在stream 0的offset为0的位置读取到的数据,视为顶点位置;在在stream 0的offset为12的位置读取到的数据,视为法线。。。。。。

在stream 1的offset为0的位置读取到的数据,视为纹理坐标0;在在stream 0的offset为8的位置读取到的数据,视为纹理坐标2。。。。。。

//

// Initializations:

//

// Here is a set of vertex definitions to support two streams.

// Vertex format:

//     stream 0 -> position + normal + color 0 + color 1

//     stream 1 -> 4 texture coordinate pairs



struct VTXSTREAM_0

{

  float fPosX, fPosY, fPosZ;

  float fNormX, fNormY, fNormZ;

  DWORD dwColor0, dwColor1;

};



struct VTXSTREAM_1

{

  float fTexU0, fTexV0;

  float fTexU1, fTexV1;

  float fTexU2, fTexV2;

  float fTexU3, fTexV3;

};



// Vertex declaration

D3DVERTEXELEMENT9 m_VtxDcl[] =

{

  {0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_POSITION, 0}, // stream 0, position

  {0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_NORMAL, 0},   // stream 0, normal



  {0, 24, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_COLOR, 0},    // stream 0, color 0

  {0, 28, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_COLOR, 1},    // stream 0, color 1



  {1, 0, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 0}, // stream 1, tex coord set 0

  {1, 8, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 1}, // stream 1, tex coord set 1



  {1, 16, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 2}, // stream 1, tex coord set 2

  {1, 24, D3DDECLUSAGE_FLOAT2, D3DDECLMETHOD_DEFAULT,

   D3DDECLUSAGE_TEXCOORD, 3}  // stream 1, tex coord set 3



}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要在你的项目中包含以下头文件: ``` #include <d3d9.h> #include <d3dx9.h> ``` 然后,创建一个 Direct3D 接口对象: ``` LPDIRECT3D9 d3d = Direct3DCreate9(D3D_SDK_VERSION); ``` 接下来,创建一个 Direct3D 设备: ``` LPDIRECT3DDEVICE9 d3ddev; d3d->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &d3ddev); ``` 在这里,`hwnd` 是窗口句柄,`d3dpp` 是一个 `D3DPRESENT_PARAMETERS` 结构体,它包含了一些设备的参数,比如屏幕大小、刷新率等等。 现在,你可以开始绘制了。首先,清除屏幕: ``` d3ddev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1.0f, 0); ``` 这会将屏幕清除为蓝色。现在,开始渲染: ``` d3ddev->BeginScene(); // 绘制代码在这里 d3ddev->EndScene(); ``` 在 `BeginScene()` 和 `EndScene()` 之间的代码就是你的绘制代码了。比如,你可以创建一个三角形: ``` struct Vertex { FLOAT x, y, z; DWORD color; }; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ | D3DFVF_DIFFUSE) Vertex vertices[] = { { 150.0f, 50.0f, 0.0f, D3DCOLOR_XRGB(255, 0, 0) }, { 250.0f, 250.0f, 0.0f, D3DCOLOR_XRGB(0, 255, 0) }, { 50.0f, 250.0f, 0.0f, D3DCOLOR_XRGB(0, 0, 255) }, }; LPDIRECT3DVERTEXBUFFER9 buffer; d3ddev->CreateVertexBuffer(3 * sizeof(Vertex), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &buffer, NULL); VOID* pVertices; buffer->Lock(0, sizeof(vertices), (void**)&pVertices, 0); memcpy(pVertices, vertices, sizeof(vertices)); buffer->Unlock(); d3ddev->SetStreamSource(0, buffer, 0, sizeof(Vertex)); d3ddev->SetFVF(D3DFVF_CUSTOMVERTEX); d3ddev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1); ``` 这会在屏幕上绘制一个彩色的三角形。 最后,别忘了在程序结束时释放 Direct3D 设备和接口对象: ``` d3ddev->Release(); d3d->Release(); ``` 这就是在火山PC上使用D3D绘制的基本流程。当然,这只是一个简单的例子,你可以通过学习更多的Direct3D相关知识,来实现更复杂的图形效果。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值