DX11 HLSL 和輸入佈局連接
C++頂點結構進入Shader輸入的過程
該部落格上撰寫的文章是出於教學目的而創建的。 另外,文章中的資訊可能不正確,請謹慎。
在 DirectX 11 中,僅建立頂點緩衝區不會導致三角形出現。 需要一個處理頂點位置的頂點著色器和一個確定像素顏色的像素著色器。
基本HLSL
struct VSInput
{
float3 Position : POSITION;
float4 Color : COLOR;
};
struct VSOutput
{
float4 Position : SV_POSITION;
float4 Color : COLOR;
};
VSOutput VSMain(VSInput Input)
{
VSOutput Output;
Output.Position = float4(Input.Position, 1.0f);
Output.Color = Input.Color;
return Output;
}
float4 PSMain(VSOutput Input) : SV_TARGET
{
return Input.Color;
}
POSITION班級COLOR是告訴 C++ 頂點資料意義的語意。 SV_POSITION是光柵器所需的螢幕位置,SV_TARGET是要記錄在渲染目標中的顏色。
著色器編譯
ID3DBlob* VSBlob = nullptr;
ID3DBlob* PSBlob = nullptr;
ID3DBlob* ErrorBlob = nullptr;
D3DCompileFromFile(
L"Triangle.hlsl", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE,
"VSMain", "vs_5_0", 0, 0, &VSBlob, &ErrorBlob
);
D3DCompileFromFile(
L"Triangle.hlsl", nullptr, D3D_COMPILE_STANDARD_FILE_INCLUDE,
"PSMain", "ps_5_0", 0, 0, &PSBlob, &ErrorBlob
);
Device->CreateVertexShader(
VSBlob->GetBufferPointer(), VSBlob->GetBufferSize(),
nullptr, &VertexShader
);
Device->CreatePixelShader(
PSBlob->GetBufferPointer(), PSBlob->GetBufferSize(),
nullptr, &PixelShader
);
如果編譯失敗ErrorBlob您可以透過列印字串來找出原因。 在不檢查檔案路徑或入口點拼字錯誤的情況下,透過查看 HRESULT 來進行偵錯是很困難的。
輸入佈局連接
D3D11_INPUT_ELEMENT_DESC Elements[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT,
0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT,
0, 12, D3D11_INPUT_PER_VERTEX_DATA, 0 }
};
Device->CreateInputLayout(
Elements,
static_cast<UINT>(std::size(Elements)),
VSBlob->GetBufferPointer(),
VSBlob->GetBufferSize(),
&InputLayout
);
C++ Vertex此結構體的實際記憶體佈局和Input Layout的Format和Offset必須相同。 由於位置為 12 位元組,因此顏色偏移量為 12。
DX11 三角形範例的重點不是要記住 API 呼叫。 關鍵在於CPU的頂點結構、輸入佈局和頂點著色器輸入必須具有完全相同的契約。