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

…待更新

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