2017-02-22 226 views
1

我正在尝试编写一些采用编译着色器并使用反射自动为顶点着色器生成输入布局的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成员InputSlotInputSlotClassInstanceDataStepRate的细节?我是否正在寻找这些信息的错误描述,或者正在通过反思获得不可能的实例细节?

如果这是不可能的,那么我猜测我唯一的另一种选择是通过预期的顶点输入布局并检查所有参数?

回答

1

只有顶点着色器才能知道InputSlot,InputSlotClassInstanceDataStepRate应该是什么值。这是一个数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义数据如何馈送给着色器。

例如,看着你的着色器输入定义,你没有给出worldMatrix是每个实例成员的指示(注释除外)。事实上,它不一定是 - 您可以使用相同的顶点着色器代码轻松制作输入布局和顶点缓冲区绑定,使其不是每个实例的数据。

作为一种替代方法,您可以在着色器代码中创建语义命名约定,以规定输入布局的值将变为实例的值,以及它们的实例提前率。例如:

matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1; 

通过解析语义,可以知道它是实例化的,输入时隙和步进速率。但是,这样的方案可能比它的价值更麻烦。在某些时候,你需要知道你有什么输入数据,以及如何将它绑定到你写的着色器,从而规定输入布局。

+0

啊,这对于着色器本身的评论来说是公平的,它实际上并没有提及任何有关插槽编号的内容。我喜欢语义思想,可以试试看。当你提到你需要知道什么输入数据你有什么意思?调用IASetVertexBuffers? – TheRarebit

+0

是的,我的意思是你需要知道你有什么顶点数据(例如用IASetVertexBuffers设置的)。虽然您可以在着色器中添加一个方案来定义该方案,但最终仍然必须拥有顶点数据。 – MuertoExcobito

+0

好吧,我明白了,并非所有东西都可以自动化我想,我喜欢输入布局生成的想法是自动的,所以可能会给你一些建议。欢呼反馈。 – TheRarebit