效果文件(管道阶段的集合)在directX中有用吗



嗨,我目前正在关注"使用directx11进行三维游戏编程"。我发现这本旧书(大约2011年)正在使用hlsl代码的效果文件。对于我的项目,我根本没有使用任何效果文件,只是制作hlsl文件和其中的代码。所以我有很多hlsl文件,只要我需要。

所以我想到了这个问题,使用效果文件进行着色器编码有用吗???如果那样的话,原因是什么???

这是用于比较效果文件和hlsl文件的示例代码(仅示例)

这是一个包含VS、PS的效果文件

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() ) ); 
} 
}

这是我的2 hlsl项目VS,PS相对

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;
}
struct PS_INPUT
{
float4 pos : SV_POSITION;
};
float4 main(PS_INPUT input) : SV_Target
{
return float4(1,1,1,1);
}

这是本线程中引用的这个问题的一个版本的答案的副本。

Q:。。。最好将每个文件中的每个着色器(即"顶点"、"几何体"、"镶嵌"、"像素")分开吗?我似乎找不到最好的方法。我看到一些示例,其中所有着色器都在一个.hlsl.fx文件中,而一些着色器则在每个vs.hlsl、ps.hlsl或vs.fx、px.fx文件中。谢谢

A:从历史上看,扩展名'.fx'是指打算使用传统效果fx_4_0、fx_5_0等配置文件构建的HLSL着色器;而".hlsl"指的是单独的hlsl着色器。事实是,这里没有一致性。您将看到许多没有任何技巧/pass语句的".fx"文件。

与C/C++源文件不同,HLSL文件可能包含许多在给定的编译器调用中被忽略的内容。如果你有一个很大的.fx文件,里面有十几个着色器和一堆技术/过程,你可以用不同的入口点和配置文件多次编译同一个文件,以生成大量着色器。

实际上,这完全取决于您希望如何构建着色器内容。例如,DirectX工具包使用命令行脚本来构建所有可能的着色器组合:目前它从12个.fx文件中构建161个着色器Blob,实际上它可以构建两次:一次使用Windows编译器,一次使用Xbox One XDK编译器,但在给定的DirectXTK.lib构建中只包含一组这些着色器Blob。DirectXTK根本不使用旧版的Effects 11。

如果使用Visual Studio 2012-2019内容管道来构建着色器,则必须处理MSBuild的限制,该限制假定每个源文件为每个结果构建一次。因此,在这种情况下,每个着色器组合都需要一个单独的.hlsl文件(对于DirectX工具包示例,这意味着161个.hlsl文件)。处理此问题的一种方法是将着色器源本身保留在一个文件中,然后拥有一堆.hlsl文件,这些文件#包括"源"文件。类似于:

// BasicEffectVSBasicVertexLighting.hlsl
// 
#include "BasicEffect.fx"
// BasicEffectPSBasicVertexLighting.hlsl
// 
#include "BasicEffect.fx"

然后使用正确的着色器配置文件和入口点编译这些.hlsl文件中的每个文件一次。这种方法适用于较小的项目,但如果不使用传统的fx配置文件,则无法很好地缩放到大型复杂着色器。在这种情况下,其他构建解决方案,如DirectX工具包的构建解决方案可能会更好。

如果您使用的是传统的fx配置文件,您当然只需要编译每个.fx一次,它将一次性生成它在技术/过程中指定的所有着色器。记住效果11:

  • Direct3D11运行时的最新效果可以在GitHub上找到
  • HLSL编译器中的fx_5_0配置文件支持已被弃用,并且不完全支持DirectX 11.1 HLSL功能,例如最低精度类型。它在HLSL编译器(FXC.EXE)和D3DCompile API(#46)的Windows 8.x/Windows 10 SDK版本中受支持。它使用D3DCompile API(#47)生成弃用警告。Shader Model 6(DXC.EXE)或更高版本的DXIL编译器不支持

相关内容

  • 没有找到相关文章

最新更新