Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ DirectX 11顶点着色器反射_C++_Reflection_Directx_Shader_Directx 11 - Fatal编程技术网

C++ DirectX 11顶点着色器反射

C++ DirectX 11顶点着色器反射,c++,reflection,directx,shader,directx-11,C++,Reflection,Directx,Shader,Directx 11,我正在尝试编写一些DirectX代码,该代码采用已编译的着色器,并使用反射自动生成顶点着色器的输入布局。我有一个简单的顶点着色器,旨在利用实例化,这是它接受的输入: struct VertexIn { // Per-vertex data float3 pos : POSITION; float4 color : COLOR; // Per-instance data matrix worldMatrix : WORLDMATRIX; }

我正在尝试编写一些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 }
当我反射已编译的着色器时,我得到了正确数量的输入参数,但当我试图通读输入描述时,我找不到填充成员
InputSlot
InputSlotClass
InstanceDataStepRate
所需的详细信息?我是在错误的描述中查找此信息,还是无法通过反射获取实例细节


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

如果只有一个顶点着色器,就不可能知道
InputSlot
InputSlotClass
InstanceDataStepRate
的值应该是什么。这是一个数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义如何将数据馈送到着色器

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

另一种方法是,可以在着色器代码中创建语义命名约定,以指定输入布局的值成为实例的内容及其实例推进率。例如:

matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1;

通过解析语义,您可以得到它是实例、输入时隙和步进速率。然而,这样的计划可能比它的价值更麻烦。在某些情况下,您需要知道您拥有什么样的输入数据,以及它将如何绑定到您编写的着色器,从而决定输入布局。

Ah对于着色器本身的注释来说,这是一个公平的观点,它实际上没有提及任何关于插槽编号的内容。我喜欢这个语义概念,不妨试试。当你提到你需要知道你有什么输入数据时,你是什么意思?诸如IASetVertexBuffers之类的调用?是的,我的意思是您需要知道您拥有哪些顶点数据(例如,使用IASetVertexBuffers设置的顶点数据)。虽然你可以在着色器中放置一个方案来定义它,但最终,你仍然必须拥有顶点数据。好的,是的,我理解,不是所有的东西都可以自动生成,我想,我喜欢自动生成输入布局的想法,尽管可以尝试一下你的建议。为反馈喝彩。