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

效果文件(管道阶段的集合)在directX中有用吗?,directx,shader,hlsl,effect,Directx,Shader,Hlsl,Effect,您好,我目前正在学习“使用directx11进行3d游戏编程”。 我发现这本旧书(大约从2011年开始)将effect文件用于hlsl代码。 对于我的项目,我根本没有使用任何效果文件,只是在其中制作hlsl文件和代码。因此,我有一个hlsl文件的数量,因为我需要 所以这个问题浮现在我的脑海中,使用效果文件进行着色器编码是否有用??? 如果是这样,那是什么原因 这是比较effect文件和hlsl文件的示例代码(仅示例) 这是一个包含VS、PS多功能一体的效果文件 cbuffer cbPerObje

您好,我目前正在学习“使用directx11进行3d游戏编程”。 我发现这本旧书(大约从2011年开始)将effect文件用于hlsl代码。 对于我的项目,我根本没有使用任何效果文件,只是在其中制作hlsl文件和代码。因此,我有一个hlsl文件的数量,因为我需要

所以这个问题浮现在我的脑海中,使用效果文件进行着色器编码是否有用??? 如果是这样,那是什么原因

这是比较effect文件和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() ) ); 
 } 
}
这是我的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编译器中的
    fx_5_0
    配置文件支持已被弃用,并且不完全支持DirectX 11.1 HLSL功能,例如最小精度类型。HLSL编译器的Windows 8.x/Windows 10 SDK版本(
    FXC.EXE
    )和D3DCompile API(#46)都支持它。它使用D3DCompile API(#47)生成一个弃用警告。着色器模型6(
    DXC.EXE
    )或更高版本的编译器不支持它

特别是这本Frank Luna的书,你应该阅读一些重要的注释。哦,非常感谢。在阅读了你的答案后,我决定暂时不使用这个特效。
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"