cbuffer / tbuffer / Buffer / Texture 在 Shader 中的區別

 

 


一. Shader 使用的資源

Shader Mode 4.0 開始支持更多種類的資源,比如 tbuffer 和 Buffer ,我們今天就來說說他們直接的區別。下面的代碼和說明是以 D3D11 爲基礎的。

 

二. cbuffer / tbuffer / Buffer / Texture 在 Shader 中的定義和使用方法

  • cbuffer

// 在 Shader 中的定義 Constant Buffer
cbuffer cbMatrices
{
	float4x4 g_matWorld_CBuffer[1024];
};
// 在 Shader 中使用 Constant Buffer
float4x4 matData=g_matWorld_CBuffer[uiIndex];
  • tbuffer

// 在 Shader 中定義 T Buffer
tbuffer tbMatrices
{
	float4x4 g_matWorld_TBuffer[1024];
};
// 在 Shader 中使用 T Buffer
float4x4 matData=g_matWorld_TBuffer[uiIndex];

 

  • Buffer

// 在 Shader 中定義 Buffer
Buffer<float4> g_matWorld_Buffer;
// 在 Shader 中使用 Buffer
uiIndex*=4;
float4 f4Row1=g_matWorld_Buffer.Load(uiIndex);
float4 f4Row2=g_matWorld_Buffer.Load(uiIndex+1);
float4 f4Row3=g_matWorld_Buffer.Load(uiIndex+2);
float4 f4Row4=g_matWorld_Buffer.Load(uiIndex+3);
float4x4 matData=float4x4(f4Row1,f4Row2,f4Row3,f4Row4);

 

  • Texture

// 在 Shader 中定義 Texture
Texture1D g_matWorld_Texture1D;
// 在 Shader 中使用 Texture
uiIndex*=4;
float4 f4Row1=g_matWorld_Texture1D.Load(float2(uiIndex,  0));
float4 f4Row2=g_matWorld_Texture1D.Load(float2(uiIndex+1,0));
float4 f4Row3=g_matWorld_Texture1D.Load(float2(uiIndex+2,0));
float4 f4Row4=g_matWorld_Texture1D.Load(float2(uiIndex+3,0));
float4x4 matData=float4x4(f4Row1,f4Row2,f4Row3,f4Row4);

 

 

三. cbuffer / tbuffer / Buffer / Texture 在程序中的反射信息和創建方法

  • cbuffer

反射 cbuffer 的時候 D3D_SHADER_INPUT_TYPE 的值是 D3D_SIT_CBUFFER.

創建 cbuffer 的時候使用 D3D11_BIND_CONSTANT_BUFFER 參數進行 CreateBuffer.

  • tbuffer

反射 tbuffer 的時候 D3D_SHADER_INPUT_TYPE 的值是 D3D_SIT_TBUFFER.

創建 tbuffer 的時候使用 D3D11_BIND_SHADER_RESOURCE 參數進行 CreateBuffer. 然後使用 D3D11_SRV_DIMENSION_BUFFER 創建 Shader Resource View.

  • Buffer

反射 Buffer 的時候 D3D_SHADER_INPUT_TYPE 的值是 D3D_SIT_STRUCTURED.

創建 Buffer 的時候使用 D3D11_BIND_SHADER_RESOURCE 參數進行 CreateBuffer. 然後使用 D3D11_SRV_DIMENSION_BUFFER 創建 Shader Resource View.

  • Texture

反射 Texture 的時候 D3D_SHADER_INPUT_TYPE 的值是 D3D_SIT_TEXTURE.

創建 Texture 的時候使用 D3D11_BIND_SHADER_RESOURCE 參數進行 CreateTexture1D. 然後使用 D3D11_SRV_DIMENSION_TEXTURE1D 創建 Shader Resource View.

 

四. 總結

首先從資源創建來看,cbuffer / tbuffer / Buffer 的資源創建方法都是 CreateBuffer ,只是參數有所差別(D3D11_BIND_CONSTANT_BUFFER 和 D3D11_BIND_SHADER_RESOURCE),而 Texture 是使用 CreateTexture1D 來創建的,這就說明 cbuffer / tbuffer / Buffer 的本質都是 Buffer,只有 Texture 的類型是不同的。另外,tbuffer / Buffer / Texture 除了創建資源本身之外還需要創建 SRV 才能使用.

其次從 Shader 使用資源來看,cbuffer 和 tbuffer 除了定義的關鍵字之外沒有區別,使用起來都是用索引取數組中的數據。而 Buffer 和 Texture 都需要使用 Load 函數來取數據。要注意的是 Texture 的 Load 方法,雖然我們聲明和創建的 Texture 是 1D Texture ,但是在 Load 的時候需要二維的紋理座標,因爲這個是真正的採樣操作。

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