DirectX9.03D 顶点缓存与索引缓存

顶点缓存与索引缓存

创建顶点缓存和索引缓存

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 2010-4-7

原文地址:https://www.cnblogs.com/fangshenghui/p/1706297.html