HLSL 将着色器拆分为多个文件

HLSL splitting shader into multiple files

这可能是个愚蠢的问题,但我一直在寻找答案很长时间,但找不到适合我的 DirectX 11 游戏引擎的答案。例如,我有两个像素着色器 AB,我不想重复我的伽玛校正代码。所以我的想法是将其移动到单独的 hlsl 文件并包含它们,但我不知道该怎么做。当我 google 时,我只能找到有关 .fx 工作流程的信息,但我没有使用它。当我试图制作一个新的着色器时,我总是得到一个错误,我的着色器需要有主要功能。我该怎么做?

编辑: 根据 VTT 的建议,我将提供示例。假设我的 uber_pixel_shader.hlsl 是这样的:

#include "gamma_utils_shader.hlsl"

...

float4 main(PS_INPUT input) : SV_TARGET
{
    ...
    finalColor = gammaCorrect(finalColor);

    return float4(finalColor, Alpha);
}

而且 HLSL 中没有方法 gammaCorrect,所以我想从另一个名为 gamma_utils_shader.hlsl 的文件中包含它。该文件如下所示:

float3 gammaCorrect(float3 inputColor)
{
    return pow(inputColor, 1.0f / 2.2f);
}

当我试图编译它时,编译器抛出错误 "Error 3501 'main': entrypoint not found"。这是真的,因为我在这个文件中没有主要方法,但我不需要一个。我如何在 Visual Studio 2017 年解决这个问题?

默认情况下,您的项目设置指定应使用 HLSL 编译器编译 HLSL 文件。这意味着在构建期间,VS 将所有 HLSL 文件(包括包含文件)排队等待编译器使用默认入口点 main 进行编译。显然这是不希望的——包含文件不能被真正编译。

要解决此问题,请右键单击 'Solution Explorer' 中的 HLSL 包含文件,单击 'Properties',然后将 'Item Type' 字段从 "HLSL Compiler" 更改为 "Does not participate in build"。这将阻止 Visual Studio 编译您的包含文件。

将来,为您的 HLSL 包含文件提供“.hlsli”扩展名。 Visual Studio 将使用 HLSL 编辑器打开这些文件,但会自动将它们识别为不参与构建过程。