如何让shaderc保留HLSL编译SPIR-V时未使用的Uniform绑定?
解决shaderc编译HLSL时保留未使用Uniform绑定的问题
shaderc对HLSL的默认处理会移除未使用的Uniform变量,这是HLSL前端的行为,和LLVM优化级别无关——即使设置优化级别为0,前端依然会剔除未使用的变量(GLSL没有这个默认行为)。要保留这些未使用的Uniform,需要启用HLSL专属的保留选项:
- 在编译选项中添加
set_hlsl_keep_unused_variables(true),这个开关会强制HLSL前端保留所有声明的变量,无论是否被使用。
修改后的Rust代码如下:
let compiler = shaderc::Compiler::new().unwrap(); let mut options = shaderc::CompileOptions::new().unwrap(); options.set_include_callback(shader_include); if *shader_lang == ShaderLanguage::HLSL { options.set_source_language(shaderc::SourceLanguage::HLSL); // 强制保留HLSL中未使用的Uniform及其他变量 options.set_hlsl_keep_unused_variables(true); }
补充说明
这个选项是HLSL特有的:HLSL编译器默认会做“死代码消除”中的变量剔除,这一步发生在LLVM优化之前,因此调整LLVM的优化级别(比如设为0)不会影响这个行为。只有通过这个专属开关,才能让shaderc保留所有声明的Uniform绑定,方便调试时向这些绑定发送数据。
内容的提问来源于stack exchange,提问作者Makogan
相关产品推荐
相关产品推荐

