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

时间:2018-04-25 01:52:54

标签: visual-studio-2017 directx-11 hlsl directx-9

我已将HLSL着色器添加到我的Visual Studio项目中,并且它们会在构建过程中自动编译为cso文件。我面临的问题是,我需要使用不同的Shader模型多次编译它们,因为即#34; / 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 个答案:

答案 0 :(得分:1)

将着色器代码放入.hlsli文件中,将其添加到项目中。为每个着色器和模型组合创建.hlsl文件,该文件执行#include.hlsli文件。将每个.hlsl添加到项目中并相应地设置文件设置。

文件1(设置为从构建中排除)

// MyShader.hlsli

PS_INPUT VertexShader( VS_INPUT input )
{
...
}

float4 PixelShader( PS_INPUT input)
{
...
}

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

// MyShader_VS.hlsl

#include "MyShader.hlsl"    

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

// MyShader_PS.hlsl

#include "MyShader.hlsl"    

文件4(设置为构建为顶点着色器,Shader Model 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> 中查找:

4_0_level_9_3
  

除非您专门针对Windows XP系统,否则在使用旧版Direc3D 9 API方面没有多大价值。只需使用DirectX 11 Feature Level 9.3+来定位Shader Model 2.0 / 3.0时代的视频卡。 Shader Model 3.0的主要价值是顶点纹理提取,无论如何,其中一个主要供应商从未实现过。 public boolean saveUserId(String saveUserId) { SharedPreferences sharedPreferences=context.getSharedPreferences(USER_DETAILS, MODE_PRIVATE); SharedPreferences.Editor editor=sharedPreferences.edit(); editor.putString(USER_ID, saveUserId); editor.apply(); return true; } 配置文件已在同一个blob中将着色器构建为2.0和4.0。