我正在尝试编写一些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读取输入描述时,我找不到填充D3D11_INPUT_ELEMENT_DESC成员InputSlot、InputSlotClass和InstanceDataStepRate所需的详细信息。我是在错误的描述中查找此信息,还是无法通过反射获取实例化的详细信息?
如果这是不可能的,那么我猜我唯一的选择就是传递期望的顶点输入布局并检查所有参数?
发布于 2017-02-23 12:00:29
如果仅提供顶点着色器,则无法知道InputSlot、InputSlotClass和InstanceDataStepRate的值应该是什么。这是一个数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义如何将数据馈送到着色器。
例如,查看着色器输入定义时,没有给出worldMatrix是每实例成员的指示(注释除外)。事实上,它不是必须的--你可以使用相同的顶点着色器代码,很容易地创建一个输入布局和顶点缓冲区绑定,这使得它不是每个实例的数据。
或者,可以在着色器代码中创建语义命名约定,以指定输入布局的值变为实例化的值及其实例化前进速率。例如:
matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1;通过解析语义,你可以得到它是实例化的,输入时隙和步速。然而,这样的方案可能会带来比其价值更多的麻烦。在某些情况下,您需要知道您拥有哪些输入数据,以及如何将其绑定到您编写的着色器,从而决定输入布局。
https://stackoverflow.com/questions/42388979
复制相似问题