首页 > 未分类 > Rendering from Vertex and Index Buffers (Direct3D 9)
2019
11-29

Rendering from Vertex and Index Buffers (Direct3D 9)

Rendering from Vertex and Index Buffers (Direct3D 9)

  Direct3D提供了索引和非索引两种绘制方式,索引方式使用一组索引(表示)所有的顶点组成,顶点数据是存储在顶点缓冲区中,索引数据是存储    在索引缓冲区中。下面是一小部分使用顶点缓冲区和索引缓冲区时所具有的公共说明。

  这些例子比较IDirect3DDevice9::DrawPrimitive 和 IDirect3DDevice9::DrawIndexedPrimitive的使用方式。

Scenario 1: Drawing Two Triangles without Indexing

     现在假如你要渲染下面这样的四边形:

     如果你使用Triangle List 图元类型渲染两个三角形,每个三角形需要存储三个单独的顶点,最终的顶点缓冲区可能像这样:

     绘图函数是很容易懂的;从顶点缓冲区的0位置开始,画两个三角形。如果裁剪是开启,顶点的使用顺序是很重要的。

     这个例子我们假如默认裁剪状态是逆时针,所以可见三角形的渲染必须是顺时针的。 Triangle List 图元类型简单的从缓冲区顺序读取三个顶点为每一个三角形,所以画的三角形是(0, 1, 2)和(3, 4, 5):

DrawPrimitive( D3DPT_TRIANGLELIST, // PrimitiveType
                     0,                               // StartVertex
                     2 );                             // PrimitiveCount

Scenario 2: Drawing Two Triangles with Indexing

     你可能注意到了,顶点缓冲区包含了重复数据在0和4,2和5这些位置。这样产生场景是因为两个三角形共用了两个顶点。这些重复的数据是浪费的,顶点缓冲区能够压缩用索引缓冲区。一个减少了顶点数据的更小的顶点缓冲区送入了graphics adapter。更重要的是,使用索引缓冲区时允许适配器存储顶点在顶点缓存中,如果图元绘制时包含了一个刚使用过的顶点,顶点能够从缓存中取来而不是顶点缓冲区中,结果性能是一个很大的提升。

    索引缓冲区(定位)顶点缓冲区,所以每一个单独的顶点只需要存储在顶点缓冲区一次。(下面是对上面一段的描叙):

    索引缓冲区中存储的是VB Index 值,VB Index 引用的是顶点缓冲区中一个特定的顶点,一个顶点缓冲区可以看成是一组顶点,所以VB Index 可以看成是顶点缓冲区中一个目标顶点的索引(位置)。相同的,IB Index 是索引缓存区的一个索引。这个很容易让人迷惑,如果不仔细,所以确信你是清晰的对这些词汇:VB Index 的值是顶点缓冲区的索引,IB Index 的值是索引缓存区的索引,而索引缓冲区的值是VB Index 的值(具体看上图)。

    绘制函数的使用方式是下面。所有参数的函数在下一段落中具体描叙,现在,你只要知道调用这个方法是要Direct3D渲染一个包含两个三角形的triangle list,开始位置在索引缓冲区是0。为了能绘出和上面相同的两个三角形,请记住要是顺时针的。

DrawIndexedPrimitive( D3DPT_TRIANGLELIST, // PrimitiveType
                                 0,                  // BaseVertexIndex
                                 0,                  // MinIndex
                                 4,                  // NumVertices
                                 0,                  // StartIndex
                                 2 );                // PrimitiveCount

 代码点击这

 

Scenario 3: Drawing One Triangle with Indexing

  假定你现在只是想画第二个三角形,但你想使用画整个四边形时用到的顶点缓冲区和索引缓冲区。

代码点击这

最后编辑:
作者:搬运工
这个作者貌似有点懒,什么都没有留下。