当常量缓冲区绑定到固定插槽时,DX11着色器反射失败

时间:2015-09-04 11:40:20

标签: c++ shader directx-11

在解析从D3DReflect()获得的信息时遇到了一个奇怪的问题。

        ID3D11ShaderReflectionConstantBuffer *pConstantBuffer = _pReflector->GetConstantBufferByIndex (ib_desc.BindPoint);
        if (pConstantBuffer == nullptr)
        {
            return E_FAIL;
        }           

        D3D11_SHADER_BUFFER_DESC cb_desc;

        if ((Result = pConstantBuffer->GetDesc(&cb_desc)) != S_OK)
        {
            MessageBoxW(GetDesktopWindow(), DXGetErrorStringW(Result), L"ERROR", MB_OK);
            return Result;
        }

当我尝试使用GetDesc()获取着色器缓冲区描述时,如果我在着色器中手动设置常量缓冲区槽,则返回E_FAIL:

cbuffer CBBakeOverlayVS : register(b1)
{
    float4 OutScaleOffset; 
    float4 UVScaleOffset;
    float4 Rotation;
};

D3DCompile和D3DReflect可以正常工作,无论有没有" :注册(b1)"。如果让编译器分配绑定点,ID3D11ShaderReflectionConstantBuffer :: GetDesc可以正常工作。

有没有人遇到同样的问题?或者只是反射缺少固定绑定点的这个功能?

提前致谢! 费边

编辑: 我还发现,只要有一个常量缓冲区,其中任何其他头中都包含固定槽,即使常量缓冲区未使用/未引用,并且D3D11_SHADER_DESC ConstantBuffers反映着色器中使用的cbuffers数量(我的着色器只有一个),GetDesc也会失败)。

0 个答案:

没有答案