我已将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文件指定多个编译(不同的着色器模型和不同的输出文件)?
答案 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。