我正在尝试编写一些DirectX代码,该代码采用已编译的着色器并使用反射自动生成顶点着色器的输入布局。我有一个简单的顶点着色器,旨在利用实例化,这是它接受的输入:
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
读取输入描述时,我找不到填写{{3}所需的详细信息成员InputSlot
,InputSlotClass
和InstanceDataStepRate
?我是否在查找有关此信息的错误描述,或者通过反思得到实例化细节?
如果这不可能,那么我猜测我唯一的另一种选择是传递预期的顶点输入布局并检查所有参数?
答案 0 :(得分:2)
在仅给定顶点着色器的情况下,无法知道InputSlot
,InputSlotClass
和InstanceDataStepRate
的值应该是什么。这是数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义数据如何馈送到着色器。
例如,查看着色器输入定义时,不会给出worldMatrix
是每个实例成员的指示(注释除外)。事实上,它不一定是 - 您可以使用相同的顶点着色器代码轻松地创建输入布局和顶点缓冲区绑定,这使得它不是每个实例数据。
作为替代方案,您可以在着色器代码中创建语义命名约定,以指示输入布局的值变为实例,以及它们的实例化提升速率。例如:
matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1;
通过解析语义,您可以获得它的实例,输入槽和步进率。但是,这样的方案可能比它的价值更麻烦。在某些时候,您需要知道您拥有哪些输入数据,以及它将如何绑定到您编写的着色器,从而指示输入布局。