Practical Rendering and Computation with Direct3D 11学习笔记(2.2.2)

2.2.2索引缓冲


2.2.2.1索引缓冲概述

       索引缓冲区引用储存在顶点缓冲区的顶点数据来定义图元,  或多或少,索引缓冲区提供了一个指向顶点列表的索引列表,根据我们期望的图元类型定义那个顶点组成我们的图元。如下图所示


         举个例子:我们定义一个矩形由两个三角形定义,v0、v1、v2、v3表示四个顶点,
  Practical Rendering and Computation with Direct3D 11学习笔记(2.2.2)_第1张图片
    那么我们创建一个顶点列表               Vertex   vertexList[4]={v0,v1,v2,v3};            
   创建索引列表                                       WORD   indexList[6]={  0,1,2               // 黄色三角形                            
                                                                                                  0,2,3  };          // 绿色三角形
    需要注意的上面的三角形的0,1,2是按照绕序排列的。减少了重复点的描述。
    这样我们就减少了顶点的重复描述数量,以达到减少数据量的目的。                    
    使用索引缓冲区能减少所需顶点的定义,既然每个相邻图元定义能引用相同的顶点数据作为它的相邻图元,在顶点缓冲区共享顶点不需要重复。另外共享的顶点允许多图元从定点着色器输出 相同的 顶点。我们应该知道紧随一个顶点通过顶点着色器后,结果被储存起来和被其他对应图元 使用(就如我们创建好黄色三角形后,V0,V2被储存起来以备 绿色三角形使用。)      

2.2.2.2 使用索引缓冲

       既然索引缓冲区指明了那个顶点在图元设置操作中被使用,那么我们必须在图元拓扑在使用之前知道那个顶点,否则我们将不知道那个顶点放在索引里。 根据选择渲染算法和几何加载惯例, 其实这已经预先确定好了。当管线配置什么时候准备执行一个Draw操作的时候,被设计好的索引缓冲区被绑定到IA阶段(输入装配阶段),在输入装配阶段为管线产生输入图元。既然这些缓冲服务一个非常明确的目的,那它通常不绑定到其他地方。绑定位置见下图,黄色
箭头的 位置。

2.2.2.3 创建索引缓冲区的

索引缓冲区创建遵循标准的缓冲区创建规则,先填充一个D3D11_BUFFER_DESC结构。索引缓冲区描述结构不会频繁地从一个缓冲区到另一个缓冲区改变,因为这样的数据类型在内容创建程序将被定义一次然后作为输出。索引缓冲区目录通常在应用程序启动阶段后不会更改。一个标准的创建序列如下:
ID3DllBuffer*CreateIndexBuffer(UINT size,
bool dynamic,
D3D11_SUBRES0URCE_DATA* pData)
{
D3D11_BUFFER_DESC desc;
desc.ByteWidth=size;
desc.MiscFlags = 0;
desc.StructureByteStride= 0;
deSC.BindFlagS=D3D11_BIND_INDEX_BUFFER;
// Select the appropriate usage and CPU access flags based on the passed
// in flags
if(dynamic )
{
desc.Usage = D3D11_USAGE_DYNAMIC;
desc.CPUAccessFlags=D3D11_CPU_ACCESS_WRITE;
}
else

       {
desc.Usage = D3D11_USAGE_IMMUTABLE;
desc.CPUAccessFlags = 0;
}
// Create the buffer with thespecifiedconfiguration
ID3DllBuffer* pBuffer = 0;
HRESULT hr = g_pDevice->CreateBuffer( &desc, pData, &pBuffer );
if ( FAILED( hr ) )
{
// Handle theerrorhere...
return( 0 );
}
return( pBuffer );
}
        第一个是按照字节指定缓冲区的大小。从代码列表上所知,索引缓冲区使用D3D11_BIND_INDEX_BUFFER绑定标志创建。我们用D3D11_USAGE_IMMUTABLE创建静态索引缓冲区,没有设置任何CPU访问标志。在这种情况下,预期的缓冲区内容必须被提供去使用D3D11_SUBRESOURCE_DATE结构创建调用。如果我们使用一个动态缓冲区,我们应该选择D3D11_USAGE_DYNAMIC和D3D11_CPU_ACCESS_WRITE  CPU访问标志一起使用。
     资源视图需求, 索引缓冲区被直接绑定在IA(输入装配阶段),不用创建资源视图。

你可能感兴趣的:(渲染,管线)