Conexión DX11 HLSL y diseño de entrada
Proceso de estructura de vértices de C++ ingresando a la entrada de Shader
Los artículos escritos en este blog fueron creados con el objetivo de enseñar. Además, la información del artículo puede ser incorrecta, así que tenga cuidado.
En DirectX 11, crear solo un búfer de vértices no hace que aparezca un triángulo. Se necesitan un Vertex Shader que procese la posición del vértice y un Pixel Shader que determine el color del píxel.
HLSL básico
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;
}
POSITIONclaseCOLORes una semántica que indica qué significan los datos de vértice de C++. SV_POSITIONes la posición de la pantalla requerida por el rasterizador,SV_TARGETes el color que se grabará en el destino de renderizado.
Compilación de sombreadores
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
);
Si la compilación fallaErrorBlobPuede descubrir la causa imprimiendo la cadena. Es difícil depurar mirando HRESULT sin verificar la ruta del archivo o los errores tipográficos en el punto de entrada.
Conexión de diseño de entrada
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++ VertexEl diseño de memoria real de la estructura y el formato y desplazamiento del diseño de entrada deben ser los mismos. Dado que la posición es de 12 bytes, el desplazamiento de color es 12.
El objetivo del ejemplo del triángulo DX11 no es memorizar llamadas API. El punto es que la estructura de vértices de la CPU, el diseño de entrada y la entrada del sombreador de vértices deben tener exactamente el mismo contrato.