D3DReflect不检测常量缓冲区

时间:2014-05-26 21:34:52

标签: c++ directx shader hlsl

所以我试图通过反射从我编译的着色器中获取常量缓冲区的数量。可悲的是,它没有按预期工作,我不知道为什么。 以下是我在ID3DBlob

中加载着色器代码的方法
ID3DBlob* vertexBlob;
HRESULT result = D3DReadFileToBlob(vertexShader.c_str(), &vertexBlob);

这就是我得到反思的方式:

ComPtr<ID3D11ShaderReflection> reflection;
HRESULT hr = D3DReflect(shader.code->GetBufferPointer(), shader.code->GetBufferSize(), IID_ID3D11ShaderReflection, reinterpret_cast<void**>(reflection.GetAddressOf()));

if (FAILED(hr)) {
    // SOMETHING WENT WRONG;
    return (nullptr);
}

D3D11_SHADER_DESC shaderDesc;
reflection->GetDesc(&shaderDesc);

如果我检查调试中的shaderDescConstantBuffers变量为0。 我已经确保对着色器所做的更改得到了认可。我添加了另一个输入变量,并且描述中的输入参数数量增加了。 最后,这里是我如何定义常量缓冲区,但我不认为这是问题所在:

cbuffer perObject 
{
    matrix worldViewProj;
};

struct vertexInput
{
    float3 position : POSITION;
    float3 color : COLOR;
};

float4 main(vertexInput input) : SV_POSITION
{
    return float4(input.position, 1.0f);
}

有没有人有任何想法可能出错?

1 个答案:

答案 0 :(得分:4)

由于您不在着色器中使用常量缓冲区,因此可能会在编译期间对其进行优化。

暂时改变你的着色器,以确保它被使用,然后看看你得到的反射:

float4 main(vertexInput input) : SV_POSITION
{
    return mul(float4(input.position, 1.0f), worldViewProj);
}