我制作了一个在屏幕上绘制绿色网格的测试着色器。 我使用与管道状态和顶点着色器中指定的布局不同的顶点执行着色器。一切正常,但为什么呢?
我上传到 GPU 的 CPU 顶点,然后将它们提供给 ID3D12GraphicsCommandList::IASetVertexBuffers(...):
struct Vertex
{
Math::Vec3 position;
Math::Vec3 normal;
Math::Vec3 tangent;
Math::Vec3 bitangent;
Math::Vec2 texCoord;
};
using VertexArray = std::vector<Vertex>;
顶点着色器:
struct VS_INPUT
{
float3 position : POSITION;
};
struct VS_OUTPUT
{
float4 position: SV_POSITION;
};
cbuffer VertexShaderCB : register(b0)
{
float4x4 viewProjMatrix;
};
VS_OUTPUT main(VS_INPUT input)
{
VS_OUTPUT output;
output.position = mul(float4(input.position, 1.0f), viewProjMatrix);
return output;
}
像素着色器:
struct VS_OUTPUT
{
float4 position: SV_POSITION;
};
float4 main(VS_OUTPUT input) : SV_TARGET
{
return float4(0.0f, 1.0f, 0.0f, 1.0f);
}
着色器管道状态输入布局:
D3D12_INPUT_ELEMENT_DESC inputLayoutElement[] =
{
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA, 0 },
};
正如您所见,顶点着色器和管线状态都将单个 float3 指定为顶点布局。 但是我的顶点缓冲区包含位置、法线、切线、双切线和 tex 坐标。 着色器怎么还在工作?