首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DirectX12反射不检测常量缓冲区

DirectX12反射不检测常量缓冲区
EN

Stack Overflow用户
提问于 2019-10-26 02:12:18
回答 2查看 170关注 0票数 0

我尝试使用shader中的变量来反映所有的常量缓冲区,但是反射器给出了错误的名称。着色器:

代码语言:javascript
复制
struct ModelViewProjection
{
    matrix MVP;
    float a;
};
struct SomeConstBuffer1
{
    matrix MVP;
    float a;
};
struct SomeConstBuffer2
{
    matrix MVP;
    float a;
};

ConstantBuffer<ModelViewProjection> cb3 : register(b3);
ConstantBuffer<SomeConstBuffer1> cb4 : register(b4);
ConstantBuffer<SomeConstBuffer2> cb6 : register(b6);

c++代码:

代码语言:javascript
复制
void Dx12CoreShader::reflectShader(SubShader& shader)
{
    ID3D12ShaderReflection* reflection;
    ThrowIfFailed(D3DReflect(shader.blob->GetBufferPointer(), shader.blob->GetBufferSize(), IID_ID3D12ShaderReflection, (void**)& reflection));

    D3D12_SHADER_DESC desc;
    reflection->GetDesc(&desc);

    // here ok. desc.ConstantBuffers == 3
    for (unsigned int i = 0; i < desc.ConstantBuffers; ++i)
    {
        ID3D12ShaderReflectionConstantBuffer* buffer = reflection->GetConstantBufferByIndex(i);

        D3D12_SHADER_BUFFER_DESC bufferDesc;
        buffer->GetDesc(&bufferDesc);
        // here ok. bufferDesc.Name == "cb3"

        // here wrong! bufferDesc.Variables==1, I expected 2       
        for (UINT j = 0; j < bufferDesc.Variables; j++)
        {
            ID3D12ShaderReflectionVariable* var = buffer->GetVariableByIndex(j);
            D3D12_SHADER_VARIABLE_DESC varDesc;
            var->GetDesc(&varDesc);
            // here also wrong.
            // I expect "MVP" first but it returns also "cb3"

        }
    }
}

我的配置: AMD Ryzen 3 2200U,带有radeon Vega Mobile Gfx。我做错了什么?这会不会是个bug?类似的情况在DirectX 11上工作正常。

UPD:我使用所有变量来防止编译器进行优化。

EN

回答 2

Stack Overflow用户

发布于 2019-10-26 03:41:25

我修好了。

代码语言:javascript
复制
cbuffer ModelViewProjection : register(b3)
{
    matrix MVP;
    float a;
};
cbuffer SomeConstBuffer1 : register(b4)
{
    matrix MVP1;
    float a1;
};
cbuffer SomeConstBuffer2 : register(b6)
{
    matrix MVP2;
    float a2;
};
票数 0
EN

Stack Overflow用户

发布于 2021-10-07 12:02:27

一旦需要cbuffer数组,就需要切换到原来使用的表示法。您发布的第二个符号是SM5.1之前使用的符号,其中SM5.1是ConstantBuffer template is considered the default

尽管如此,还是有一种方法可以获得所需的所有数据,方法是遍历反射数据并检查D3D12_SHADER_TYPE_DESC类的cbuffer变量是否为D3D_SVC_STRUCT,然后您可以遍历成员。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58563676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档