如何使用ID3D12ShaderReflection::GetVariableByName方法
How to use ID3D12ShaderReflection::GetVariableByName method
我使用 D3DCompiler 编译了以下着色器:
struct vertex_in
{
float3 position : POSITION;
float2 tex_coord : TEXCOORD;
};
struct vertex_out
{
float4 position : SV_POSITION;
float2 tex_coord : TEXCOORD;
};
Texture2D g_texture : register(t0);
SamplerState g_sampler : register(s0);
vertex_out VS(vertex_in vin)
{
vertex_out vout;
vout.position = float4(vin.position , 1.0f);
vout.tex_coord = vin.tex_coord;
return vout;
}
float4 PS(vertex_out pin) : SV_Target
{
float2 test_var;
test_var.x = 0.0f;
test_var.y = 1.0f;
return g_texture.Sample(g_sampler, test_var);
}
我想使用 ID3D12ShaderReflection
接口来获取有关上述像素着色器中名为 test_var
的变量的信息。这就是我目前正在尝试的:
com_ptr<ID3D12ShaderReflection> pixel_shader_reflector;
D3DReflect(pixel_shader->GetBufferPointer(), pixel_shader->GetBufferSize(), winrt::guid_of<ID3D12ShaderReflection>(), pixel_shader_reflector.put_void());
std::string test_var = "test_var";
ID3D12ShaderReflectionVariable* sr_variable = pixel_shader_reflector->GetVariableByName(test_var.c_str());
D3D12_SHADER_VARIABLE_DESC shader_var_desc = {};
sr_variable->GetDesc(&shader_var_desc);
但是我收到以下错误:
Exception thrown at 0x00007FFBF7AB5299 (KernelBase.dll) in wzrd_editor.exe: WinRT originate error - 0x80004005 : 'Unspecified error'.
Exception thrown at 0x00007FFBF7AB5299 in wzrd_editor.exe: Microsoft C++ exception: winrt::hresult_error at memory location 0x00000053DE1FB058.
HLSL 着色器反射 API 旨在公开有关全局变量的元数据,而不是可能在单个着色器中优化掉的内部局部变量。参见 Microsoft Docs。
您遇到异常是因为您没有检查从 GetVariableByName
返回的 nullptr
。
我使用 D3DCompiler 编译了以下着色器:
struct vertex_in
{
float3 position : POSITION;
float2 tex_coord : TEXCOORD;
};
struct vertex_out
{
float4 position : SV_POSITION;
float2 tex_coord : TEXCOORD;
};
Texture2D g_texture : register(t0);
SamplerState g_sampler : register(s0);
vertex_out VS(vertex_in vin)
{
vertex_out vout;
vout.position = float4(vin.position , 1.0f);
vout.tex_coord = vin.tex_coord;
return vout;
}
float4 PS(vertex_out pin) : SV_Target
{
float2 test_var;
test_var.x = 0.0f;
test_var.y = 1.0f;
return g_texture.Sample(g_sampler, test_var);
}
我想使用 ID3D12ShaderReflection
接口来获取有关上述像素着色器中名为 test_var
的变量的信息。这就是我目前正在尝试的:
com_ptr<ID3D12ShaderReflection> pixel_shader_reflector;
D3DReflect(pixel_shader->GetBufferPointer(), pixel_shader->GetBufferSize(), winrt::guid_of<ID3D12ShaderReflection>(), pixel_shader_reflector.put_void());
std::string test_var = "test_var";
ID3D12ShaderReflectionVariable* sr_variable = pixel_shader_reflector->GetVariableByName(test_var.c_str());
D3D12_SHADER_VARIABLE_DESC shader_var_desc = {};
sr_variable->GetDesc(&shader_var_desc);
但是我收到以下错误:
Exception thrown at 0x00007FFBF7AB5299 (KernelBase.dll) in wzrd_editor.exe: WinRT originate error - 0x80004005 : 'Unspecified error'.
Exception thrown at 0x00007FFBF7AB5299 in wzrd_editor.exe: Microsoft C++ exception: winrt::hresult_error at memory location 0x00000053DE1FB058.
HLSL 着色器反射 API 旨在公开有关全局变量的元数据,而不是可能在单个着色器中优化掉的内部局部变量。参见 Microsoft Docs。
您遇到异常是因为您没有检查从 GetVariableByName
返回的 nullptr
。