我尝试使用shader中的变量来反映所有的常量缓冲区,但是反射器给出了错误的名称。着色器:
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。我做错了什么?这会不会是个bug?类似的情况在DirectX 11上工作正常。
UPD:我使用所有变量来防止编译器进行优化。
发布于 2019-10-26 03:41:25
我修好了。
cbuffer ModelViewProjection : register(b3)
{
matrix MVP;
float a;
};
cbuffer SomeConstBuffer1 : register(b4)
{
matrix MVP1;
float a1;
};
cbuffer SomeConstBuffer2 : register(b6)
{
matrix MVP2;
float a2;
};发布于 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,然后您可以遍历成员。
https://stackoverflow.com/questions/58563676
复制相似问题