zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    课堂作业04 2017.10.27
    课程作业 03 动手动脑 2017.10.20
    课程作业 03 2017.10.20
    HDU 3974 Assign the task
    POJ 2155 Matrix
    POJ 2481 Cows
    HDU 3038 How Many Answers Are Wrong
    CS Academy Array Removal
    POJ_1330 Nearest Common Ancestors LCA
    CF Round 427 D. Palindromic characteristics
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/1706297.html
Copyright © 2011-2022 走看看