效果文件(管道阶段的集合)在directX中有用吗?
您好,我目前正在学习“使用directx11进行3d游戏编程”。 我发现这本旧书(大约从2011年开始)将effect文件用于hlsl代码。 对于我的项目,我根本没有使用任何效果文件,只是在其中制作hlsl文件和代码。因此,我有一个hlsl文件的数量,因为我需要 所以这个问题浮现在我的脑海中,使用效果文件进行着色器编码是否有用??? 如果是这样,那是什么原因 这是比较effect文件和hlsl文件的示例代码(仅示例) 这是一个包含VS、PS多功能一体的效果文件效果文件(管道阶段的集合)在directX中有用吗?,directx,shader,hlsl,effect,Directx,Shader,Hlsl,Effect,您好,我目前正在学习“使用directx11进行3d游戏编程”。 我发现这本旧书(大约从2011年开始)将effect文件用于hlsl代码。 对于我的项目,我根本没有使用任何效果文件,只是在其中制作hlsl文件和代码。因此,我有一个hlsl文件的数量,因为我需要 所以这个问题浮现在我的脑海中,使用效果文件进行着色器编码是否有用??? 如果是这样,那是什么原因 这是比较effect文件和hlsl文件的示例代码(仅示例) 这是一个包含VS、PS多功能一体的效果文件 cbuffer cbPerObje
cbuffer cbPerObject
{
float4x4 gWorldViewProj;
};
struct VertexIn
{
float3 Pos : POSITION;
float4 Color : COLOR;
};
struct VertexOut
{
float4 PosH : SV_POSITION;
float4 Color : COLOR;
};
VertexOut VS(VertexIn vin)
{
VertexOut vout;
vout.PosH = mul(float4(vin.Pos, 1.0f), gWorldViewProj);
vout.Color = vin.Color; return vout;
}
float4 PS(VertexOut pin) : SV_Target
{
return pin.Color;
}
technique11 ColorTech
{
pass P0
{
SetVertexShader( CompileShader( vs_5_0, VS() ) );
SetPixelShader( CompileShader( ps_5_0, PS() ) );
}
}
这是我的VS,PS的2 hlsl项目
struct VS_INPUT
{
float3 pos : POSITION;
};
struct VS_OUTPUT
{
float4 pos : SV_POSITION;
};
VS_OUTPUT main(VS_INPUT input)
{
VS_OUTPUT output;
output.pos = float4(input.pos, 1);
return output;
}
这里有一份答案的副本,该答案在中引用 Q:…是否最好将每个文件中的每个着色器(即顶点、几何体、细分、像素)分开?我似乎找不到最好的做法。我看到一些示例将所有着色器都放在一个
.hlsl
或.fx
文件中,并且每个vs.hlsl、ps.hlsl或vs.fx、px.fx文件中都有一些着色器。谢谢
A:历史上的扩展“.fx”指的是使用传统效果fx_4_0、fx_5_0等配置文件构建的HLSL着色器;而“.hlsl”指的是单个hlsl着色器。事实是,这里没有一致性。您将看到大量的“.fx”文件,其中没有任何技巧/传递语句
与C/C++源文件不同,HLSL文件可以包含许多在给定的编译器调用中被忽略的内容。如果您有一个大的.fx文件,其中包含十几个着色器和一系列技术/过程,则可以使用不同的入口点和配置文件多次编译同一文件,以生成大量着色器
这实际上是一个如何构建着色器内容的问题。例如,使用命令行脚本构建所有可能的着色器组合:目前它从12个.fx
文件中构建161个着色器blob——实际上它可以构建两次:一次使用Windows编译器,一次使用Xbox One XDK编译器,但无论如何,在给定的DirectXTK.lib构建中只包含一组着色器blob。DirectXTK根本不使用遗留效果11
如果使用Visual Studio 2012-2019内容管道构建着色器,则必须处理MSBuild的限制,该限制假定每个源文件为每个结果构建一次。因此,在这种情况下,每个着色器组合都需要一个单独的.hlsl
文件(对于DirectX工具包示例,这意味着161个.hlsl
文件)。处理此问题的一种方法是将着色器源本身保存在单个文件中,然后拥有一组包含“源”文件的.hlsl文件。比如:
然后使用适当的着色器配置文件和入口点编译每个.hlsl文件一次。这种方法适用于较小的项目,但如果不使用传统的fx配置文件,则无法很好地扩展到大型复杂着色器。在这种情况下,其他构建解决方案(如DirectX工具包的构建解决方案)可能会更好
如果您使用的是传统的fx配置文件,您当然只需编译每个.fx
一次,它将一次性生成它在技术/过程中指定的所有着色器。记住效果11:
- 可以在上找到Direct3D 11运行时的最新效果
- HLSL编译器中的
配置文件支持已被弃用,并且不完全支持DirectX 11.1 HLSL功能,例如最小精度类型。HLSL编译器的Windows 8.x/Windows 10 SDK版本(fx_5_0
)和D3DCompile API(#46)都支持它。它使用D3DCompile API(#47)生成一个弃用警告。着色器模型6(FXC.EXE
)或更高版本的编译器不支持它DXC.EXE
struct PS_INPUT
{
float4 pos : SV_POSITION;
};
float4 main(PS_INPUT input) : SV_Target
{
return float4(1,1,1,1);
}
// BasicEffectVSBasicVertexLighting.hlsl
//
#include "BasicEffect.fx"
// BasicEffectPSBasicVertexLighting.hlsl
//
#include "BasicEffect.fx"