在解析从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也会失败)。