DX11 HLSL- und Input-Layout-Verbindung
Prozess der Eingabe der C++-Vertexstruktur in die Shader-Eingabe
Die in diesem Blog verfassten Artikel wurden mit dem Ziel erstellt, zu unterrichten. Außerdem können die Informationen im Artikel falsch sein, also seien Sie bitte vorsichtig.
Wenn in DirectX 11 nur ein Vertex-Puffer erstellt wird, wird kein Dreieck angezeigt. Benötigt werden ein Vertex-Shader, der die Vertex-Position verarbeitet, und ein Pixel-Shader, der die Pixelfarbe bestimmt.
Grundlegendes 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;
}
POSITIONKlasseCOLORist eine Semantik, die angibt, was C++-Scheitelpunktdaten bedeuten. SV_POSITIONist die vom Rasterizer benötigte Bildschirmposition,SV_TARGETist die Farbe, die im Renderziel aufgezeichnet werden soll.
Shader-Kompilierung
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
);
Wenn die Kompilierung fehlschlägtErrorBlobSie können die Ursache herausfinden, indem Sie die Zeichenfolge ausdrucken. Es ist schwierig, Fehler zu beheben, indem man sich das HRESULT ansieht, ohne den Dateipfad oder Tippfehler am Einstiegspunkt zu überprüfen.
Eingabe-Layout-Verbindung
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++ VertexDas tatsächliche Speicherlayout der Struktur und das Format und der Offset des Eingabelayouts müssen identisch sein. Da die Position 12 Byte beträgt, beträgt der Farbversatz 12.
Der Sinn des DX11-Dreiecksbeispiels besteht nicht darin, sich API-Aufrufe zu merken. Der Punkt ist, dass die Vertexstruktur, das Eingabelayout und die Vertex-Shader-Eingabe der CPU genau den gleichen Vertrag haben müssen.