顶点缓存与索引缓存
创建顶点缓存和索引缓存
HRESULT IDirect3DIndexBuffer9:: CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DVertexBuffer9 ** ppVertexBuffer,
HANDLE * pHandle
);
HRESULT IDirect3DIndexBuffer9:: CreateVertexBuffer(
UINT Length,
DWORD Usage,
DWORD FVF,
D3DPOOL Pool,
IDirect3DVertexBuffer9 ** ppVertexBuffer,
HANDLE * pHandle
);
Lingth 为缓存分配的字节数。如果想让顶点缓存足够存储8个顶点 设为8*sizeof(Vertex),
Usega 指定头天如何使用缓存的一些属性。可为0 或以标记:
·D3DUSAGE_DYNAMIC 将缓存设为动因缓存。
·D3DUSAGE_POINTS 该 标记规定缓存将用于存储点图元。
·D3DUSAGE_SOFTWAREPROCESSSING 软件顶点运算方式。
·D3DUSAGE_WRITEONLY 规定应用缓存的操作模式为“只写”。这样,驱动程序就可以将缓存放在最适合写操作的内存地址中。注意对使用譔 标记创建的缓存进行作将会出错。
FVF 存储在顶点缓存中在顶点的灵活在顶点格式。
Pool 容纳缓存的内在池
ppVertexBuuffer 用于接收所创建的在顶点缓存的指针。
Format 指定索引的大小 设为D3DFMT_INDEX16表示16位索引。设为D3DFMT_INDEX32表示32位索引
ppIndexBuffer 用于接收所凶那的索引缓存的指针。
访问缓存内容
用Lock薱铙取指向缓存内容的指针 访问结束后用Unlock进行解锁
HRESULT IDirect3DVertexBuffer9:: Lock(
UINT OffsetToLock,
UINT SizeToLock,
VOID **ppbData,
DWORD Flags
);
HRESULT IDirect3DIndexBuffer9:: Lock(
UINT OffsetToLock,
UINT SizeToLock,
VOID **ppbData,
DWORD Flags
);
OffsetToLock 自缓存上进心始点到开始锁定的位置的偏移量, 单位为字节
SizeToLock 所要锁定的字节数。
ppbData 指向被锁定的存储起始位置的指针。
Flags 该标记描述了锁定的方式 可以为0
·D3DLOCK_DISCARD 该标记公用于动态缓存。它指示硬将缓存内容丢弃,并返回一个指向重新分配的缓存的指针。该标记十分有用,国为这允许在我们访问新分配的内存时, 硬件能够继续使用被丢弃的缓存中的数据进行绘制,这样硬件的绘制就不会中止。
· D3DLOCK_NOOVERWRITE 该标记仅用于动态缓存。 使用该 标记后, 数据只能以追加方式写入缓存,即你不能覆盖当前用于绘制的存储区中的任何内容。
· D3DLOCK_READONLY 该标记表示对于你所 锁定的缓存只可读而不可写。
获取顶点缓存和索引缓存的信息
处到有关顶点缓存和懿旨缓存的信息。
D3DVERTEXBUFFER_DESC vbDescription;
vertexBuffer->GetDesc(&vbDescription); //get vb info
D3DINDEXBUFFER_DESC ibDescription;
indexBuffer->GatDesc(&ibDescription); //get vb info
D3DVERTEXBUFFER_DESC和D3DINDEXBUFFER_DESC结构的定义如下:
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;
绘制状态 (有的翻译为“渲染状态”)
当你的应用程序需要使用一种不同于默认值 的绘制状态时 才需要对其进行修改。直至该状态被修改始终有效。
HRESULT IDirect3DDevice9::SetRenderState (
D3DRENDERSTATETYPE State //the state to change
DWORD Value //value of the new state
);
绘制的准备工作
创建了顶点缓存以及索引缓存 就可能对其所存储的内容进行绘制 绘制之前 有3个步骤要完成
1)指定数据流输入源。将在顶点缓存和数据流进行链接 寵上是将几何体的信息传输到绘制流水线中。
方法如下:
HRESULT IDirect3DDevice9::SetStreamSource(
UINT StreamNumber,
IDirect3DVertexBuffer9* pStreamData,
UINT OffsetInBytes,
);
·StreamNumber 标识与顶点缓存建立的数据流 不能用是可设为0
·pStreamData 指向 希望与给定数据流建立链接的顶点缓存的指针
·OffsetInBytes 自数据流的起始点算起的一个偏移量,单位为字节, 指定起始位置。
·Stride 将要链接到数据流的顶点缓存中每个元素的大小,单位为字节。
例如:
//vb是一个存储为Vertex类型顶点数据的顶点缓存。
_device->SetStreamSource(0, vb, 0, sizeof(Vertex));
2) 设置顶点格式。 在这里指定后续绘制调用中使用的顶点格式。
_device->SetFVF(D3DFVF_XYZ|D2DFVF_DIFFUSE|D3DFVF_TEX1);
3) 设置索引缓存。任意时刻只允许使用一个索引缓存。 要用一不同的索引缓存绘制物体时, 必须进行切换。 设置如下:
_device->SetIndices (_ib); //pass copy of index buffer pointer.
使用顶点缓存和索引缓存进行绘制
创建好顶点/索引缓存以及做好准备工作以后,通过使用DrawPrimitive或者DrawIndexedPrimitive将待货运几何体的信息通过 绘制流水线传输。这些方法从顶点流中获得顶点信息以及从索引缓存中获得索引信息。
该方法可用于绘制未使用索引信息的图元
HRESULT IDirect3DDevice9::DrawPrimitive(
D3DPRIMITIVETYPE PrimitiveType,
UINT StartVertex,
UINT PrimitiveCount
);
·PrimitiveType绘制的图元类型。比如,我们能绘制点和线以及三角形。以后我们使用三角形,用D3DPT_TRIANGLELIST参数。
·StartVertex 顶点数据流中标只顶点数据读取起点的元素的索引。该参数赋予了我们一定的自由度, 使得我们可以只对顶点缓存中的某一部分进行绘制。
·PrimitiveCount 绘制图元的数量。
这个方法使用索引信息来绘制图元。
HRESULT IDirect3DDevice9::DrawIndexedPrimitive(
D3DPRIMITIVETYPE Type,
INT BaseVertexIndex,
UINT MinIndex,
UINT NumVertices,
UINT StartIndex,
UINT PrimitiveCount
);
·Type 所绘制的图元类型。比如,能绘制点和线以及三角形。由于我们使用三角形,用D3DPT_TRIANGLELIST参数。
·BaseVertexIndex为索引增加一个基数,
·MinIndex允许引用的最小索引值。
·NuVertices——本次调用中将被引用的顶点总数。
·StartIndex 顶点缓存中樯索引的读取起始点的元素的索引
·PrimitiveCount 绘制图元的总数。
Benin/End Sciene
所在的绘制方法都必须在IDirect3DDevice9::BeginScene和IDirect3DDevice9::EndScene构成的方法对之间进行调用。
例如:
_device->BeginScene();
_device->DrawPrim(….)
_device->EndScene();
《DirectX 9.0 3D游戏开发编程基础》笔记
江西理工大学FangSH