DirectX 11 顶点着色器反射
DirectX 11 Vertex Shader Reflection
我正在尝试编写一些 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
, I can't find the details that I need to fill the D3D11_INPUT_ELEMENT_DESC
成员 InputSlot
、InputSlotClass
和 [= 读取输入描述时16=]?我是在寻找此信息的错误描述,还是无法通过反射获取实例化详细信息?
如果这不可能,那么我猜我唯一的其他选择是传递预期的顶点输入布局并检查所有参数?
不可能知道 InputSlot
、InputSlotClass
和 InstanceDataStepRate
的值应该是多少,只给定一个顶点着色器。这是数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义了数据如何馈送到着色器。
例如,查看您的着色器输入定义,您没有给出(除了注释)worldMatrix
是一个实例成员。事实上,它不一定是 - 您可以使用相同的顶点着色器代码轻松制作输入布局和顶点缓冲区绑定,使其不是每个实例数据。
作为替代方案,您可以在着色器代码中创建语义命名约定,以指示输入布局的哪些值被实例化,以及它们的实例化推进率。例如:
matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1;
通过语义解析,可以得到实例化,输入槽和步长。然而,这样的方案可能会带来更多麻烦而不是它的价值。在某些时候,您将需要知道您有哪些输入数据,以及它将如何绑定到您编写的着色器,从而决定输入布局。
我正在尝试编写一些 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
, I can't find the details that I need to fill the D3D11_INPUT_ELEMENT_DESC
成员 InputSlot
、InputSlotClass
和 [= 读取输入描述时16=]?我是在寻找此信息的错误描述,还是无法通过反射获取实例化详细信息?
如果这不可能,那么我猜我唯一的其他选择是传递预期的顶点输入布局并检查所有参数?
不可能知道 InputSlot
、InputSlotClass
和 InstanceDataStepRate
的值应该是多少,只给定一个顶点着色器。这是数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义了数据如何馈送到着色器。
例如,查看您的着色器输入定义,您没有给出(除了注释)worldMatrix
是一个实例成员。事实上,它不一定是 - 您可以使用相同的顶点着色器代码轻松制作输入布局和顶点缓冲区绑定,使其不是每个实例数据。
作为替代方案,您可以在着色器代码中创建语义命名约定,以指示输入布局的哪些值被实例化,以及它们的实例化推进率。例如:
matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1;
通过语义解析,可以得到实例化,输入槽和步长。然而,这样的方案可能会带来更多麻烦而不是它的价值。在某些时候,您将需要知道您有哪些输入数据,以及它将如何绑定到您编写的着色器,从而决定输入布局。