2.2.2索引缓冲
2.2.2.1索引缓冲概述
索引缓冲区引用储存在顶点缓冲区的顶点数据来定义图元, 或多或少,索引缓冲区提供了一个指向顶点列表的索引列表,根据我们期望的图元类型定义那个顶点组成我们的图元。如下图所示
举个例子:我们定义一个矩形由两个三角形定义,v0、v1、v2、v3表示四个顶点,
那么我们创建一个顶点列表
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(输入装配阶段),不用创建资源视图。