如何在Visual Studio中多次编译HLSL着色器?

3
我在Visual Studio项目中添加了HLSL着色器,并且它们会在构建过程中自动编译为cso文件。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为例如“/4_0_level_9_3”适用于DirectX 11,但不适用于DirectX 9,而“/3_0”仅适用于DirectX 9,但不适用于DirectX 11。
将相同的文件多次添加到Visual Studio项目中无效,而我希望避免复制HLSL源文件,因为这会增加维护工作量和潜在的错误原因。我也不能在Visual Studio中创建单独的目标/配置来实现这一点,因为我需要支持可在运行时切换的两个DirectX版本。
在Visual Studio中有没有办法为单个HLSL文件指定多个编译(不同的着色器模型和不同的输出文件)?
1个回答

6
将您的着色器代码放入一个名为.hlsli的文件中,并将其添加到项目中。为每个着色器和模型组合创建一个.hlsl文件,其中包含您的.hlsli文件的#include。将每个.hlsl添加到项目中并适当设置文件设置。
文件1(设置为排除构建)
// MyShader.hlsli

PS_INPUT VertexShader( VS_INPUT input )
{
...
}

float4 PixelShader( PS_INPUT input)
{
...
}

第二个文件(设置为构建为顶点着色器,Shader Model 9_3,入口点VertexShader)

// MyShader_VS.hlsl

#include "MyShader.hlsl"    

文件3(设置为构建像素着色器,Shader Model 9_3,入口点PixelShader)

// MyShader_PS.hlsl

#include "MyShader.hlsl"    

文件 4(设置为构建为顶点着色器,着色器模型 4.0,入口点 VertexShader)

// MyShader_VS4.hlsl

#include "MyShader.hlsl"    

第5个文件(设置为构建像素着色器,Shader Model 4.0,入口点PixelShader)

// MyShader_PS4.hlsl

#include "MyShader.hlsl"    

请注意,您可以通过手动编辑 vcxproj 文件来使生活变得更加轻松。查找 Label="UserMacros",然后在每个配置的 ItemDefinitionGroup 后添加一个 <FXCompile> 部分以设置更好的默认值(而不是 4.0_level_9_1)。
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Link>
...
</Link>
<ClCompile>
...
</ClCompile>
<FXCompile>
  <ShaderModel>4.0_level_9_3</ShaderModel>
</FXCompile>

除非您专门针对 Windows XP 系统进行开发,否则使用传统的 Direc3D 9 API 没有太大的价值。只需使用 DirectX 11 Feature Level 9.3+ 就可以针对 Shader Model 2.0/3.0 时代的显卡了。Shader Model 3.0 的主要价值在于顶点纹理获取,但其中一个主要的供应商从未实现过该功能。 4_0_level_9_3 配置文件已经将着色器同时构建为 2.0 和 4.0 形式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接