如何在 visual studio 中多次编译 hlsl 着色器?
How to compile hlsl shaders multiple times in visual studio?
我已将 HLSL 着色器添加到我的 Visual Studio 项目中,并且作为构建过程的一部分,它们会自动编译为 cso 文件。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于 DirectX 11,但不适用于 DirectX 9,而“/3_0 " 仅适用于 DirectX 9 但不适用于 DirectX 11。
将相同的文件多次添加到 Visual Studio 项目是行不通的,我想避免复制 HLSL 源文件,因为这会增加维护工作量和潜在的错误原因。我也无法在 Visual Studio 中创建单独的 targets/configuration 来实现此目的,因为我需要在可执行文件中支持两个 DirectX 版本(可在运行时切换)。
有什么方法可以在Visual Studio中为单个 HLSL 文件指定多个编译(不同的着色器模型和不同的输出文件)?
将您的着色器代码放入 .hlsli
文件中,并将其添加到您的项目中。为每个着色器和模型组合创建一个 .hlsl
文件,该文件执行 .hlsli
文件的 #include
。将每个 .hlsl
添加到您的项目并适当地设置文件设置。
文件 1(设置为从构建中排除)
// MyShader.hlsli
PS_INPUT VertexShader( VS_INPUT input )
{
...
}
float4 PixelShader( PS_INPUT input)
{
...
}
文件 2(设置为构建为顶点着色器、着色器模型 9_3、入口点顶点着色器)
// MyShader_VS.hlsl
#include "MyShader.hlsl"
文件 3(设置为构建像素着色器、着色器模型 9_3、入口点像素着色器)
// MyShader_PS.hlsl
#include "MyShader.hlsl"
文件 4(设置为构建为顶点着色器、着色器模型 4.0、入口点顶点着色器)
// MyShader_VS4.hlsl
#include "MyShader.hlsl"
文件 5(设置为构建为像素着色器、着色器模型 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>
Unless you are specifically targeting Windows XP systems, there's not much value in using the legacy Direc3D 9 API at all. Just use DirectX 11 Feature Level 9.3+ to target Shader Model 2.0/3.0 era video cards. The main value of Shader Model 3.0 was vertex texture fetch which was never implemented by one of the major vendors anyhow. The 4_0_level_9_3
profile already builds the shader as both 2.0 and 4.0 in the same blob.
我已将 HLSL 着色器添加到我的 Visual Studio 项目中,并且作为构建过程的一部分,它们会自动编译为 cso 文件。我面临的问题是,我需要使用不同的着色器模型多次编译它们,因为“/4_0_level_9_3”适用于 DirectX 11,但不适用于 DirectX 9,而“/3_0 " 仅适用于 DirectX 9 但不适用于 DirectX 11。
将相同的文件多次添加到 Visual Studio 项目是行不通的,我想避免复制 HLSL 源文件,因为这会增加维护工作量和潜在的错误原因。我也无法在 Visual Studio 中创建单独的 targets/configuration 来实现此目的,因为我需要在可执行文件中支持两个 DirectX 版本(可在运行时切换)。
有什么方法可以在Visual Studio中为单个 HLSL 文件指定多个编译(不同的着色器模型和不同的输出文件)?
将您的着色器代码放入 .hlsli
文件中,并将其添加到您的项目中。为每个着色器和模型组合创建一个 .hlsl
文件,该文件执行 .hlsli
文件的 #include
。将每个 .hlsl
添加到您的项目并适当地设置文件设置。
文件 1(设置为从构建中排除)
// MyShader.hlsli
PS_INPUT VertexShader( VS_INPUT input )
{
...
}
float4 PixelShader( PS_INPUT input)
{
...
}
文件 2(设置为构建为顶点着色器、着色器模型 9_3、入口点顶点着色器)
// MyShader_VS.hlsl
#include "MyShader.hlsl"
文件 3(设置为构建像素着色器、着色器模型 9_3、入口点像素着色器)
// MyShader_PS.hlsl
#include "MyShader.hlsl"
文件 4(设置为构建为顶点着色器、着色器模型 4.0、入口点顶点着色器)
// MyShader_VS4.hlsl
#include "MyShader.hlsl"
文件 5(设置为构建为像素着色器、着色器模型 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>
Unless you are specifically targeting Windows XP systems, there's not much value in using the legacy Direc3D 9 API at all. Just use DirectX 11 Feature Level 9.3+ to target Shader Model 2.0/3.0 era video cards. The main value of Shader Model 3.0 was vertex texture fetch which was never implemented by one of the major vendors anyhow. The
4_0_level_9_3
profile already builds the shader as both 2.0 and 4.0 in the same blob.