- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我将 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、入口点 VertexShader)
// MyShader_VS.hlsl
#include "MyShader.hlsl"
文件 3(设置为构建像素着色器、着色器模型 9_3、入口点像素着色器)
// MyShader_PS.hlsl
#include "MyShader.hlsl"
文件 4(设置为构建为顶点着色器、着色器模型 4.0、入口点 VertexShader)
// MyShader_VS4.hlsl
#include "MyShader.hlsl"
文件 5(设置为构建像素着色器、着色器模型 4.0、入口点像素着色器)
// 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.
关于visual-studio-2017 - 如何在 visual studio 中多次编译 hlsl 着色器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50012933/
在 HLSL/Directx11 中工作时,我看到有两种绑定(bind) 3D 渲染目标的方法:绑定(bind)整个目标或在指定图层时绑定(bind)它。 如果绑定(bind)整个目标,如何在 HLS
我正在将一些 OpenCL 代码转换为 DirectCompute,需要在计算着色器中处理 8 位字符串,但找不到“字节”或“字符”的 HLSL 数据类型。 OpenCL 支持“char”类型,所以我
我是一个初学者像素着色器作家,我遇到了一些麻烦。我想获取 256x256、16 位输入 (DXGI_FORMAT_R16_UINT) 图像,并通过 256x256 查找纹理 (DXGI_FORMAT_
我正在寻找可以将 cg/hlsl 混合着色器转换为 glsl es 着色器的工具。我已经尝试过 hlsl2glsl,它不理解关键字“extern”,尽管它是一个可行的 hlsl 关键字,并且查看了 c
我正在寻找可以将 cg/hlsl 混合着色器转换为 glsl es 着色器的工具。我已经尝试过 hlsl2glsl,它不理解关键字“extern”,尽管它是一个可行的 hlsl 关键字,并且查看了 c
在过去一个月左右的时间里,我一直在努力学习 DirectX。所以我一直在 DirectX 9 和 10 之间来回混合。我在两者中看到的主要变化之一是如何在显卡中处理 vector 。 我注意到的一个重
统一缓冲区和常量缓冲区有什么区别? 它们是完全分开的还是可以将制服视为在恒定缓冲区中?换句话说,如果你想设置一个uniform,你需要一个常量缓冲区还是有其他方法? 我问是因为我有四个变量(float
在详细介绍之前,我想概述一下问题: 我使用 RWStructuredBuffers 来存储我的计算着色器 (CS) 的输出。由于顶点和像素着色器无法从 RWStructuredBuffers 中读取,
似乎此功能的文档记录很差。在 DirectX SDK 中的几何着色器教程中,没有使用 CreateGeometryShaderWithStreamOutput 的示例,也没有任何线程可以解释它的基础知
在着色器模型 3.0 中,我很确定这是一个不,但我还是想问这个, 在着色器模型 5.0 中,您可以在顶点着色器中对纹理进行采样吗? 如果我想为每个顶点提供大量补充信息,我有哪些选择? 编辑: 显然可以
我有一个 HLSL 像素着色器: struct PixelShaderInput { float4 pos : SV_POSITION; float2 texCoord : TEX
我正在尝试实现基于 GPU 的几何裁剪贴图,但在将简单的高度图应用于我的地形时遇到问题。对于高度图,我使用表面格式为“single”的简单纹理。我从 Catalinz's XNA blog 获取了纹理
我想知道 HLSL 中的那些输入和输出语义是干什么用的? 即为什么我必须写那个 TEXCOORD0; struct VS_OUTPUT { float2 tc : TEXCOORD0; }; 当
我找不到任何关于如何在 HLSL 中获取数组长度的文档或示例。 我将一组灯光推送到 hlsl 着色器,我想做一个 for(int i=0; i
HLSL 是否有像 GLSL 这样的常见矩阵的预定义变量? 我在找 gl_ProjectionMatrix和 gl_ModelViewMatrix分别? 谢谢! 最佳答案 不,不幸的是它没有。 您必须
我正在尝试在我的几何着色器中实现行进立方体算法。所以我将我的数据网格放入 Texture3D 中。现在我想在几何着色器中查找数据,这会引发错误“无法将表达式映射到 gs_4_0 指令集” 这是他抛出错
我正在尝试在 HLSL 中制作类似 Photoshop 的斜角效果。 困难的部分是找到一个点与最近边缘的距离(其中 alpha=0) 任何人有任何想法如何做到这一点? 最好的事物, 软件 最佳答案 花
所以,好吧。我正在尝试在我的小型游戏引擎中实现法线贴图,但我无法让它工作。 当我只使用每个顶点法线进行照明时,一切都很好,但是如果我尝试使用法线贴图进行照明,那么一切都会分崩离析。 我知道我有正确的
我正在编写一个着色器(HLSL),并且需要将颜色值打包为R32格式。我发现了用于将浮点数打包为R8G8B8A8格式的各种代码,但它们似乎都没有相反的作用。我的目标是SM3.0,因此(afaik)位操作
我有一个着色器,我想在其中移动顶点着色器中的一半顶点。我试图从性能的角度决定最好的方法,因为我们正在处理超过 100,000 个顶点,所以速度至关重要。我查看了 3 种不同的方法:(伪代码,但足以给你
我是一名优秀的程序员,十分优秀!