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

康斯坦丁

我已将 HLSL 着色器添加到我的 Visual Studio 项目中,并且作为构建过程的一部分,它们会自动编译为 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 文件指定多个编译(不同的着色器模型和不同的输出文件)?

查克·沃尔伯恩

将您的着色器代码放入一个.hlsli文件中,并将其添加到您的项目中。为每个着色器和模型组合创建一个.hlsl文件,文件执行#include您的.hlsli文件。将每个添加.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(设置为构建为 Pixel Shader、Shader Model 9_3、Entry-point PixelShader)

// MyShader_PS.hlsl

#include "MyShader.hlsl"    

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

// MyShader_VS4.hlsl

#include "MyShader.hlsl"    

文件 5(设置为构建为 Pixel Shader、Shader Model 4.0、Entry-point 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。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Visual Studio C#项目中编译hlsl着色器文件

CMAKE避免在Visual Studio上编译HLSL着色器文件

像素值在 DirectX 11 HLSL 着色器中的表现如何?

Premake5:如何构建HLSL着色器?

如何在HLSL着色器中进行自己的深度缓冲?

WebAssembly中的着色器如何表示?

如何在WebGL GLSL着色器中处理大数?

如何在Android的着色器中声明OpenGL版本?

如何在Dart中同步加载着色器文件

如何在着色器中制作波形扭曲效果?

如何在glsl中编写基本着色器?

如何在ThreeJS中更改着色器颜色

如何在Visual Studio 2017中启动HLSL调试器?

WebGL如何避免长着色器编译使标签停滞

如何将此HLSL像素着色器校正为四边形的圆角?

如何在Visual Studio Code中禁用语法着色

使用Roslyn C#着色器的Visual Studio 2013上的着色方法

如何通过代码在Unity中更改着色器的Alpha

如何解决VirtualBox中的着色器模型问题?

如何解决 webgl 着色器中的循环错误

如何在Metal中组合使用不同着色器的渲染命令编码器

如何在Metal片段着色器中实现/使用原子计数器?

如何在Visual Studio Code中编译C程序?

如何在Visual Studio中编译C ++文件?

如何在Visual Studio 2017中编译更少/无效的文件

如何在Visual Studio中启用C ++ 17编译?

如何在Visual Studio中编译Objective-C代码

如何在Visual Studio 2015中禁用实时编译

在 GLSL (WebGL) 中,如何在片段着色器中获取屏幕像素 X 位置?