如何通过dxc的-D参数创建带引号的宏定义以控制HLSL文件引入?
问题:通过DXC命令行宏动态控制HLSL头文件引入
我需要用main.hlsl作为通用材质着色器入口,通过宏INCLUDE_FILE动态引入不同的着色器实现文件。本地写死宏定义时代码可以正常运行:
#define INCLUDE_FILE "include.hlsl" #include INCLUDE_FILE
但尝试通过DXC命令行的-D参数定义该宏时,始终无法得到正确的引号包裹效果,两种尝试均报错:
尝试1:CMD转义引号命令
dxc -E Main -T ps_6_0 -DINCLUDE_FILE="\"include.hlsl\"" .\main.hlsl
报错信息:
.\main.hlsl:5:10: error: expected "FILENAME" or <FILENAME> #include INCLUDE_FILE ^ <built-in>:67:22: note: expanded from here #define INCLUDE_FILE \include.hlsl\\ ^
尝试2:PowerShell单引号包裹命令
dxc -E Main -T ps_6_0 -DINCLUDE_FILE='"include.hlsl"' .\main.hlsl
报错信息:
.\main.hlsl:5:10: error: expected "FILENAME" or <FILENAME> #include INCLUDE_FILE ^ <built-in>:66:22: note: expanded from here #define INCLUDE_FILE include.hlsl ^
两种方式最终生成的宏要么丢失引号,要么转义错误,不符合#define INCLUDE_FILE "include.hlsl"的正确格式。
解决方法
方法1:针对终端调整引号转义方式
不同终端对引号的解析规则不同,需要针对性调整:
- CMD环境:直接使用反斜杠转义双引号
dxc -E Main -T ps_6_0 -DINCLUDE_FILE=\"include.hlsl\" .\main.hlsl - PowerShell环境:用单引号包裹整个宏值,或者给
-D参数整体加双引号再转义# 方式A dxc -E Main -T ps_6_0 -DINCLUDE_FILE='\"include.hlsl\"' .\main.hlsl # 方式B dxc -E Main -T ps_6_0 "-DINCLUDE_FILE=\"include.hlsl\"" .\main.hlsl
方法2:HLSL代码内补全引号(跨终端通用)
为避免不同终端的转义麻烦,可以在HLSL代码中通过宏字符串化来补全引号,命令行直接传递不带引号的路径:
- 修改
main.hlsl代码:// 定义字符串化宏 #define STRINGIFY(x) #x #define INCLUDE_PATH(x) STRINGIFY(x) // 直接引入宏对应的路径(命令行传参时无需带引号) #include INCLUDE_PATH(INCLUDE_FILE) - 命令行编译命令:
dxc -E Main -T ps_6_0 -DINCLUDE_FILE=include.hlsl .\main.hlsl
这种方式无需处理终端转义,兼容性更强。
内容的提问来源于stack exchange,提问作者Martin Z He
相关产品推荐
相关产品推荐

