← SEARCHABLE ARCHIVE
DirectX 11 · 2026-07-10

DX11 HLSL- und Input-Layout-Verbindung

Prozess der Eingabe der C++-Vertexstruktur in die Shader-Eingabe

INTERACTIVE READING MODE →

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.