文章

[ShaderGraph]ScaledScreenParams字段无定义问题

[ShaderGraph]ScaledScreenParams字段无定义问题

[ShaderGraph]ScaledScreenParams字段无定义问题

00 前置知识

在写ShaderGraphCustom Function的时候, 会遇到undefinition of '_ScaledScreenParams' at line xx的问题.

实际情况是,

ShaderGraph在Preview的时候会调用PreviewTarget这个Target.

路径是Library/PackageCache/com.unity.shadergraph@12.1.10/Editor/Generation/Targets/PreviewTarget.cs

能在代码中查到include是这些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
includes = new IncludeCollection
{
    // Pre-graph
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/Common.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/Packing.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/TextureStack.hlsl", IncludeLocation.Pregraph },       // TODO: put this on a conditional
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/NormalSurfaceGradient.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/Color.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/Texture.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/UnityInstancing.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.render-pipelines.core/ShaderLibrary/EntityLighting.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariablesFunctions.hlsl", IncludeLocation.Pregraph },
    { "Packages/com.unity.shadergraph/ShaderGraphLibrary/Functions.hlsl", IncludeLocation.Pregraph },

    // Post-graph
    { "Packages/com.unity.shadergraph/ShaderGraphLibrary/PreviewVaryings.hlsl", IncludeLocation.Postgraph },
    { "Packages/com.unity.shadergraph/ShaderGraphLibrary/PreviewPass.hlsl", IncludeLocation.Postgraph },
}

其中这个文件Packages/com.unity.shadergraph/ShaderGraphLibrary/ShaderVariables.hlsl里面有只定义了_ScreenParams:

1
2
3
4
5
// x = width
// y = height
// z = 1 + 1.0/width
// w = 1 + 1.0/height
float4 _ScreenParams;

而运行态时, Unity会用"Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl", 该文件中才定义了_ScaledScreenParams.

1
float4 _ScaledScreenParams;

01 解决方案

这个时候在Custom Function中, 加入如下宏:

1
2
3
4
5
#ifndef SHADERGRAPH_PREVIEW
#include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Input.hlsl"
#else
#define _ScaledScreenParams _ScreenParams
#endif

意思是在Preview时, 无视渲染缩放, 统一用_ScreenParams既可以解决.

参考网页
本文由作者按照 CC BY 4.0 进行授权