Direct3D 11基础--缓冲区资源(Buffer Resource)

介绍

在Direct3D 11中 Buffer Resource提供了一维线性内存块。可以使用许多不同的配置来更改缓冲区的行为,但是它们都具有相同的基本线性布局
在这里插入图片描述
缓冲区的大小以字节为单位度量,组成缓冲区的元素可以有不同的大小,这取决于缓冲区的类型,以及每个特定缓冲区类型的特定配置。一些缓冲区类型将主要用于应用程序的c++端,而另一些缓冲区类型将主要用于HLSL着色器程序。本节将探讨每种不同类型的缓冲区,描述它们提供的功能,并演示如何创建它们。此外,我们将讨论缓冲区的常见用法,并提供基本的HLSL语法来声明和在着色器程序中使用这些资源。

Vertex Buffers

顶点缓冲区的目的是存放所有最终将组装成顶点并通过渲染管线发送的数据。最简单的顶点缓冲区配置是顶点结构数组,其中每个顶点包含位置、法向量和纹理座标等元素。这些顶点元素必须符合可用的格式和类型规范。然而,在顶点中需要的任何通用信息也可以打包到顶点结构中,以允许为特定的渲染算法定制输入数据。
除了上面描述的简单数组样式的顶点缓冲区之外,这些缓冲区还允许其他一些更复杂的配置。例如,可以同时使用多个顶点缓冲区。这允许顶点数据分开存储在不同的缓冲区中。例如,顶点位置可以存储在一个缓冲区中,顶点法向量可以存储在另一个缓冲区中。这允许应用程序根据需要有选择地添加顶点数据,而不是为所有渲染场景使用一个大的整体缓冲区。这种技术可以用来减少渲染操作所需的带宽。
也可以执行实例渲染,其中一个或多个顶点缓冲区提供模型的每个顶点数据,另外一个顶点缓冲区提供每个实例数据,而不是每个顶点数据。通过第二个缓冲区的实例数据,将第一个缓冲区的模型数据渲染成一系列的实例模型。每个实例的数据可以包括一个世界座标转换、颜色变化或用于区分模型的不同实例的任何其他内容。这种设置允许通过一个draw调用渲染许多对象,从而降低了渲染操作的总体CPU开销。
在这里插入图片描述
从图中可以看出,每种类型的顶点缓冲区都遵循我们的一般缓冲区布局。每个缓冲区都是由相同大小的元素组成的一维数组。单个数据元素的大小总是与同一缓冲区中的其他元素的大小相同,尽管如果使用多个缓冲区,它们可能具有不同的元素大小。

Vertex Buffer使用

如上所述,顶点缓冲区的主要目的是为渲染管线提供每个顶点的信息,可以是直接提供,也可以是通过实例提供。为此,将顶点缓冲区绑定到管道的主要位置位于input assembler阶段,该阶段作为渲染管线的入口点。除了input assembler阶段,顶点缓冲区也可以附加到stream output阶段,以允许渲染管线将顶点数据流到缓冲区中,以便在后续的渲染 passes中使用数据。

创建Vertex Buffer

在渲染管线中可以绑定资源的位置,每种资源都必须在创建时设置相应的绑定标志,以便允许将资源绑定到那里。记住这一点,顶点缓冲区必须始终设置d3d11_bind_vertex_buffer绑定标志。如果该缓冲区还用于从渲染管线中流出顶点数据那么还可以选择性的包含D3D11_BIND_STREAM_OUTPUT绑定标志。
除了绑定标志的选择之外,顶点缓冲区的另一个主要考虑因素是缓冲区将要使用的场景。取决于顶点缓冲区的内容是否会频繁更改,以及这些更改是否来自CPU或GPU,将需要不同的使用标志。例如,如果将加载到缓冲区的数据是静态的,那么应该使用d3d11_usage_constant usage标志创建缓冲区资源。在这种情况下,当创建缓冲区时,它将通过传递给创建方法的D3D11_SUBRESURCE_DATA参数用顶点数据初始化,并且再也不会被修改。这种类型的顶点缓冲区的一个例子将用于保存静态地形网格的内容。
但是,如果CPU经常更新缓冲区,则应该使用D3D11_USAGE_DYNAMIC创建缓冲区,并为CPU访问标志参数使用CPU写标志。这种类型的顶点缓冲区使用的一个例子是,当顶点转换在CPU上而不是GPU上执行时。然后,这些更新将被复制到每个帧的缓冲区资源中。这是一种常用的技术,通过将所有模型数据放入同一参照系(通常是world space或view space),将许多draw调用压缩为一个调用。第三种使用类型是创建一个缓冲区,该缓冲区将由GPU使用流输出功能进行更新。在本例中,将使用D3D11_USAGE_DEFAULT usage标志。
在这里插入图片描述

ID3DllBuffer* CreateVertexBuffer( UINT size,bool dynamic,bool streamout,D3D11_SUBRES0URCE_DATA* pData )
{
	D3D11_BUFFER_DESC desc;
	desc.ByteWidth = size;
	desc.MiscFlags = 0;
	desc.StructureByteStride = 0;
// Select the appropriate binding locations based on the passed in flags
	if ( streamout )
		desc.BindFlags = D3D11_BIND_VERTEX_BUFFER | D3D11_BIND_STREAM_0UTPUT;
	else
		desc.BindFlags = D3D11_BIND_VERTEX_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 the specified configuration
	ID3D11Buffer* pBuffer = 0;
	HRESULT hr = g_pDevice->CreateBuffer( &desc, pData, &pBuffer );
	if ( FAILED( hr ) )
	{
	// Handle the error here...
		return( 0 );
	}
	return( pBuffer );
}

Resource View

顶点缓冲区直接绑定到IA阶段或Stream Output阶段。因此,在使用资源视图时不需要创建资源视图。

Index Buffer

…待更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章