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

  • 相关阅读:
    t-SNE可视化(MNIST例子)
    numpy得到数组的index
    Latex的各种帽子
    Mac OSX安装 GitLab 5.x
    yii2 关系...
    基于git的源代码管理模型——git flow
    spl_autoload_register
    如何創建一個自己的 Composer/Packagist 包 (PHP)
    正则表达式语法
    sublime php插件
  • 原文地址:https://www.cnblogs.com/fangshenghui/p/1706297.html
Copyright © 2011-2022 走看看