我正在尝试编写一些采用编译着色器并使用反射自动为顶点着色器生成输入布局的DirectX代码。我有一个旨在利用实例化一个简单的顶点着色器,这是它接受输入:DirectX 11顶点着色器反射
struct VertexIn
{
// Per-vertex data
float3 pos : POSITION;
float4 color : COLOR;
// Per-instance data
matrix worldMatrix : WORLDMATRIX;
};
而且我的布局,如果我是用手来写,会是:
// Per-vertex data
{ "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
{ "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_VERTEX_DATA, 0 },
// Per-instance data.
{ "WORLDMATRIX", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "WORLDMATRIX", 1, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "WORLDMATRIX", 2, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 },
{ "WORLDMATRIX", 3, DXGI_FORMAT_R32G32B32A32_FLOAT, 1, D3D11_APPEND_ALIGNED_ELEMENT, D3D11_INPUT_PER_INSTANCE_DATA, 1 }
当我反映编译着色器,我得到的输入参数正确的号码,但是当我试图通过D3D11_SIGNATURE_PARAMTER_DESC
读取输入的描述,我无法找到我需要补D3D11_INPUT_ELEMENT_DESC
成员InputSlot
,InputSlotClass
和InstanceDataStepRate
的细节?我是否正在寻找这些信息的错误描述,或者正在通过反思获得不可能的实例细节?
如果这是不可能的,那么我猜测我唯一的另一种选择是通过预期的顶点输入布局并检查所有参数?
啊,这对于着色器本身的评论来说是公平的,它实际上并没有提及任何有关插槽编号的内容。我喜欢语义思想,可以试试看。当你提到你需要知道什么输入数据你有什么意思?调用IASetVertexBuffers? – TheRarebit
是的,我的意思是你需要知道你有什么顶点数据(例如用IASetVertexBuffers设置的)。虽然您可以在着色器中添加一个方案来定义该方案,但最终仍然必须拥有顶点数据。 – MuertoExcobito
好吧,我明白了,并非所有东西都可以自动化我想,我喜欢输入布局生成的想法是自动的,所以可能会给你一些建议。欢呼反馈。 – TheRarebit