[ShaderGraph]ScaledScreenParams字段无定义问题
[ShaderGraph]ScaledScreenParams字段无定义问题
[ShaderGraph]ScaledScreenParams字段无定义问题
00 前置知识
在写ShaderGraph的Custom 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 进行授权