顶点索引缓冲区:
一个顶点缓冲区是一个连续的存储了顶点数据的内存。IDirect3DVertexBuff9.
一个索引缓冲区是一个连续的存储了索引数据的内存。IDirect3DIndexBuff9.
创建顶点索引缓冲区:
HRESULT IDirect3DDevice9::CreateVertexBuffer(
UINT Length, //分配的缓冲区字节大小,顶点个数×Sizeof(vertex)
DWORD Usage, //怎么使用缓冲区信息,
//D3DUSAGE_DYNAMIC,D3DUSAGE_POINTS,
//D3DUSAGE_SOFTWAREPROCESING,D3DUSAGE_WRITEONLY
DWORD FVF, // 存储在缓冲区的顶点格式
D3DPOOL Pool, //缓冲区放置在那个内存池
IDirect3DVertexBuffer9** ppVertexBuffer, //创建好的缓冲区指针
HANDLE* pSharedHanlder //没有使用设置为0
);
HRESULT IDirect3DDevice9::CreateIndexBuffer(
UINT Length,
DWORD Usage,
D3DFORMAT format, //指定索引大小,D3DFMT_INDEX16
D3DPOOL pool,
IDirect3DIndexBuffer9** ppIndexBuffer,
HANDLE* pSharedHanlder
)
访问缓冲区内存:我们通过指针访问缓冲区数据必须使用Lock方法,使用完必须对其解锁。
HRESULT IDirect3DVertexBuffer9::Lock(
UINT OffsetToLock, //偏移量,以字节为单位。
UINT SizeToLock, //锁定字节数
BYTE** ppbData, //指定锁定内存开始位置指针
DWORD Flags //怎么描述锁定内存,
//D3DLOCK_DISCARD,D3DLOCK_NOOVERWRITE,D3DLOCK_READONLY
)
HRESULT IDirect3DIndexBuffer9::Lock(
UINT OffsetToLock,
UINT SizeToLock,
BYTE** ppbData,
DWORD Flags
)
找回索引及索引缓冲区信息.
D3DVERTEXBUFFER_DESC vbDescription.
IDirect3DVertexBuffer9->GetDesc(&vbDescription)
D3DINDEXBUFFER_DESC ibDescription.
IDirect3DIndexBuffer9->GetDesc(&ibDescription)
typedef struct _D3DVertexBuffer_Desc{
D3DFORMAT Format,
D3DRESOURCETYPE Type,
DWORD Usage,
D3DPOOL Pool,
UINT Size,
DWORD FVF
)D3DVERTEXBUFFER_DESC
typedef struct _D3DIndexBuffer_Desc{
D3DFORMAT Format,
D3DRESOURCETYPE Type,
DWORD Usage,
D3DPOOL Pool,
UINT Size,
)D3DINDEXBUFFER_DESC
渲染状态:设置渲染状态 IDirect3DDevice::SetRenderState(
D3DRENDERSTATETYPE type,
DWORD Value)
绘制准备:
1、设置资源流:
HRESULT IDirect3DDevice::SetStreamSource(
UINT SourceNumber, //顶点与那个缓冲区挂钩
IDirect3DVertexBuffer9** vertexBuffer, //缓冲区指针
UINT OfferSetInBytes, //相对流开始处的偏移量
UINT Stride //操作的每一部分流的大小 sizeof(vertex)
)
2、设置顶点格式:
IDirect3DDevice->SetFVF(D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
3、设置索引缓冲区:
IDirect3DDevice->SetIndices(_ib)
3、用顶点缓冲区绘制
HRESULT IDirect3DDevice->DrawPrimitive(
D3DPRIMITIVETYPE primitiveType, //用来绘制的图元类型 D3DPT_TRIANGLELIST
UINT StartVertex, //索引在流中的一个元素
UINT PrimitiveCount //绘制图元个数
)
HRESULT IDirect3DDevice->DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type, //绘制的图元类型 D3DPT_TRIANGLELIST
INT BaseVertexIndex, //一个基本数字,调用中用它来加索引
UIN MinIndex, //将被引用的最小索引值
UIN NumVertices, //在此调用中被引用的索引数
UIN StartIndex, //索引到索引缓冲的某个位置
UIN PrimitiveCount //绘制的图元个数
)
开始结束场景:
IDirect3DDevice->BeginScene();
IDirect3DDevice->DrawPrimitive(...);
IDirect3DDevice->EndScene();
D3DX几何物体:
D3DXCreateBox, D3DXCreateSphere,D3DXCreateCylinder
IDirectMesh
HRESULT D3DXCreateTeapot(
LPDIRECT3DDEVICE9 pDevice,
LPD3DXMESH** ppMesh,
LPD3DXBUFFER* ppAdjacency
)
mesh->DrawSubset();
绘制实例过程:
1、创建两个全局变量保存立方体的顶点和索引数据。
2、设置屏幕大小的全局变量。
3、设置顶点结构。
4、Setup过程:创建顶点缓冲区,创建索引缓冲区。
5、锁定顶点缓冲区,设置顶点。
6、锁定索引缓冲区,设置索引。
7、放置摄像机,设置View。
8、设置投影模式。
9、设置RanderState
10、Display过程:设置旋转角度模式,在世界模式下。
11、清除Scence.
12、绘制准备,设置顶点关联流。
13、设置索引关联流。
14、设置FVF格式。
15、绘制索引缓冲区。
16、呈现。
17、释放资源