Отражение DirectX12 не определяет постоянный буфер - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь отразить все постоянные буферы с переменными из шейдера, но отражатель дает неправильные имена. шейдер:

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 ++ код:

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. Что я делаю неправильно? это может быть ошибкой? Подобная ситуация работает правильно в DirectX 11.

UPD: я использую все переменные для предотвращения оптимизации компилятором.

1 Ответ

0 голосов
/ 25 октября 2019

Я исправил.

cbuffer ModelViewProjection : register(b3)
{
    matrix MVP;
    float a;
};
cbuffer SomeConstBuffer1 : register(b4)
{
    matrix MVP1;
    float a1;
};
cbuffer SomeConstBuffer2 : register(b6)
{
    matrix MVP2;
    float a2;
};
...