← SEARCHABLE ARCHIVE
DirectX 11 · 2026-07-03

Natives DirectX 11-Dreiecks-Rendering

Zeichnen Sie ein Dreieck von Device to Draw

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.

Um in DirectX 11 ein Dreieck zu zeichnen, benötigen Sie Device, DeviceContext, SwapChain, RenderTargetView, VertexBuffer und Shader. Fassen wir nur den für das Rendern erforderlichen Kernfluss zusammen, mit Ausnahme des Fenstererstellungscodes.

Erstellen Sie ein Gerät und eine Swap-Kette

DXGI_SWAP_CHAIN_DESC Desc{};
Desc.BufferCount = 1;
Desc.BufferDesc.Width = Width;
Desc.BufferDesc.Height = Height;
Desc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
Desc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;
Desc.OutputWindow = WindowHandle;
Desc.SampleDesc.Count = 1;
Desc.Windowed = TRUE;
Desc.SwapEffect = DXGI_SWAP_EFFECT_DISCARD;

D3D11CreateDeviceAndSwapChain(
    nullptr,
    D3D_DRIVER_TYPE_HARDWARE,
    nullptr,
    0,
    nullptr,
    0,
    D3D11_SDK_VERSION,
    &Desc,
    &SwapChain,
    &Device,
    nullptr,
    &DeviceContext
);

Das Gerät erstellt GPU-Ressourcen und DeviceContext wird zum Aufzeichnen und Ausführen von Befehlen verwendet. SwapChain ersetzt den auf dem Bildschirm angezeigten BackBuffer.

Erstellen Sie RenderTargetView

ID3D11Texture2D* BackBuffer = nullptr;
SwapChain->GetBuffer(0, IID_PPV_ARGS(&BackBuffer));
Device->CreateRenderTargetView(BackBuffer, nullptr, &RenderTargetView);
BackBuffer->Release();

Erstellen Sie eine Ansicht, damit die BackBuffer-Textur als Renderziel verwendet werden kann.

Vertex-Puffer erstellen

struct Vertex
{
    DirectX::XMFLOAT3 Position;
    DirectX::XMFLOAT4 Color;
};

Vertex Vertices[] =
{
    { {  0.0f,  0.5f, 0.0f }, { 1, 0, 0, 1 } },
    { {  0.5f, -0.5f, 0.0f }, { 0, 1, 0, 1 } },
    { { -0.5f, -0.5f, 0.0f }, { 0, 0, 1, 1 } }
};

D3D11_BUFFER_DESC BufferDesc{};
BufferDesc.ByteWidth = sizeof(Vertices);
BufferDesc.Usage = D3D11_USAGE_DEFAULT;
BufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;

D3D11_SUBRESOURCE_DATA InitialData{};
InitialData.pSysMem = Vertices;

Device->CreateBuffer(&BufferDesc, &InitialData, &VertexBuffer);

Zeichnen Sie jeden Rahmen

const float ClearColor[4] = { 0.08f, 0.08f, 0.12f, 1.0f };
DeviceContext->ClearRenderTargetView(RenderTargetView, ClearColor);

UINT Stride = sizeof(Vertex);
UINT Offset = 0;
DeviceContext->IASetVertexBuffers(0, 1, &VertexBuffer, &Stride, &Offset);
DeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
DeviceContext->IASetInputLayout(InputLayout);

DeviceContext->VSSetShader(VertexShader, nullptr, 0);
DeviceContext->PSSetShader(PixelShader, nullptr, 0);
DeviceContext->OMSetRenderTargets(1, &RenderTargetView, nullptr);
DeviceContext->RSSetViewports(1, &Viewport);

DeviceContext->Draw(3, 0);
SwapChain->Present(1, 0);

Draw(3, 0)Liest 3 Eckpunkte beginnend bei 0 und zeichnet ein Dreieck. Wenn nur ein schwarzer Bildschirm angezeigt wird, überprüfen Sie am besten die Scheitelpunktreihenfolge, das Ansichtsfenster, die Ergebnisse der Shader-Kompilierung und die RenderTarget-Verbindung.