Natives DirectX 11-Dreiecks-Rendering
Zeichnen Sie ein Dreieck von Device to Draw
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.