【问题标题】:DirectX 11 Vertex Shader ReflectionDirectX 11 顶点着色器反射
【发布时间】:2017-02-22 10:44:41
【问题描述】:

我正在尝试编写一些 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 成员@ 的详细信息987654327@、InputSlotClassInstanceDataStepRate?我是否查看了有关此信息的错误描述,或者无法通过反射获得实例详细信息?

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

【问题讨论】:

    标签: c++ reflection directx shader directx-11


    【解决方案1】:

    仅给定一个顶点着色器,无法知道InputSlotInputSlotClassInstanceDataStepRate 的值应该是多少。这是数据绑定与数据处理的问题。顶点着色器处理数据,但输入布局定义了数据如何馈送到着色器。

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

    作为替代方案,您可以在着色器代码中创建语义命名约定,以规定输入布局的哪些值成为实例化,以及它们的实例化推进率。例如:

    matrix worldMatrix : WORLDMATRIX_INSTANCED_1_1;
    

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

    【讨论】:

    • 啊,关于着色器本身的注释,这是一个公平的观点,它实际上并没有提到任何关于插槽号的内容。我喜欢语义的想法,可能会尝试一下。当您提到您需要知道您拥有哪些输入数据时,您的意思是什么? IASetVertexBuffers 等调用?
    • 是的,我的意思是您需要知道您拥有哪些顶点数据(例如,使用 IASetVertexBuffers 设置的数据)。虽然您可以在着色器中放置一个方案来定义它,但最终,您仍然必须拥有顶点数据。
    • 好吧,我明白了,我想并不是所有的事情都可以自动化,我喜欢自动生成输入布局的想法,但可以尝试一下您的建议。为反馈干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 2021-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多