Visual studio 2017 如何在visual studio中多次编译hlsl着色器?

Visual studio 2017 如何在visual studio中多次编译hlsl着色器?,visual-studio-2017,directx-11,hlsl,directx-9,Visual Studio 2017,Directx 11,Hlsl,Directx 9,我已经将HLSL着色器添加到我的Visual Studio项目中,它们将作为构建过程的一部分自动编译到cso文件中。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于DirectX 11,但不适用于DirectX 9,而“/3_0”仅适用于DirectX 9,而不适用于DirectX 11 将相同的文件多次添加到VisualStudio项目不起作用,我希望避免复制HLSL源文件,因为这会增加维护工作和潜在的错误原因。我也不能在VisualStudi

我已经将HLSL着色器添加到我的Visual Studio项目中,它们将作为构建过程的一部分自动编译到cso文件中。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于DirectX 11,但不适用于DirectX 9,而“/3_0”仅适用于DirectX 9,而不适用于DirectX 11

将相同的文件多次添加到VisualStudio项目不起作用,我希望避免复制HLSL源文件,因为这会增加维护工作和潜在的错误原因。我也不能在VisualStudio中创建单独的目标/配置来实现这一点,因为我需要在可执行文件中支持两个DirectX版本(可在运行时切换)


有没有办法在Visual Studio中为单个HLSL文件指定多个编译(不同的着色器模型和不同的输出文件)?

将着色器代码放入
文件中。hlsli
文件,将其添加到项目中。为每个着色器和模型组合创建一个
.hlsl
文件,该文件包含
.hlsli
文件的
#include
。将每个
.hlsl
添加到项目中,并适当设置文件设置

文件1(设置为从生成中排除)

文件2(设置为生成为顶点着色器,着色器模型9_3,入口点VertexShader)

文件3(设置为生成为像素着色器、着色器模型9_3、入口点像素着色器)

文件4(设置为生成为顶点着色器、着色器模型4.0、入口点VertexShader)

文件5(设置为生成为像素着色器、着色器模型4.0、入口点像素着色器)

请注意,通过使用文本编辑器手动编辑
vcxproj
文件,您可以让生活变得更轻松。查找
Label=“UserMacros”
,然后在
项目定义组中为每个配置添加一个
部分,以设置更好的默认值(而不是
4.0\u level\u 9\u 1
):


...
...
4.0级9级3级
除非您专门针对Windows XP系统,否则使用传统的Direc3D 9 API没有多大价值。只需使用DirectX 11功能级别9.3+以着色器模型2.0/3.0时代的视频卡为目标。Shader Model 3.0的主要价值是顶点纹理获取,但无论如何,一家主要供应商从未实现过该功能。
4\u 0\u level\u 9\u 3
配置文件已在同一个blob中将着色器构建为2.0和4.0

// MyShader.hlsli

PS_INPUT VertexShader( VS_INPUT input )
{
...
}

float4 PixelShader( PS_INPUT input)
{
...
}
// MyShader_VS.hlsl

#include "MyShader.hlsl"    
// MyShader_PS.hlsl

#include "MyShader.hlsl"    
// MyShader_VS4.hlsl

#include "MyShader.hlsl"    
// MyShader_PS4.hlsl

#include "MyShader.hlsl"    
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Link>
...
</Link>
<ClCompile>
...
</ClCompile>
<FXCompile>
  <ShaderModel>4.0_level_9_3</ShaderModel>
</FXCompile>