Duc*_*tor 0 c# shader hlsl unity-game-engine
在 github 上找到了一个带有着色器的 Unity 软体资源。由于对Unity着色器的了解有限,我不知道上述错误是什么意思。
代码(第22行是发生错误的地方,我已经标记了。):
Shader "Custom/Circle" {
Properties {
_Color ("Color", Color) = (1, 1, 1, 1)
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert_img
#pragma fragment frag
#pragma target 3.0
float4 _Color;
float4 frag(v2f_img i): COLOR {
fixed4 transparent = float4(float3(_Color),0); // << ERROR IS HERE >>
float distance = length(i.uv - float2(0.5, 0.5));
float delta = fwidth(distance);
float alpha = smoothstep(0.5, 0.5 - delta, distance);
return lerp(transparent, _Color, alpha);
}
ENDCG
}
}
}
Run Code Online (Sandbox Code Playgroud)
您的代码中有两处错误:
1 .您正在将一个参数传递给float3with float3(_Color)。
2 .您将两个参数传递给float4with float4(float3(_Color),0)。
float3需要 3 个参数,而float4和fixed4需要 4 个参数。我认为名字已经说明了这一点。
您必须将每个单独的颜色分量(_Color.r、_Color.g、_Color.b)传递给然后用它来float3创建float4。
该行代码应该是:
fixed4 transparent = float4(float3(_Color.r, _Color.g, _Color.b),0);
Run Code Online (Sandbox Code Playgroud)
请注意,_Color.a缺少 (alpha)。这就是使它透明的原因,因为 alpha 设置为0。
我真的不认为float3这里需要这样做,所以这也应该有效:
fixed4 transparent = float4(_Color.r, _Color.g, _Color.b, 0);
Run Code Online (Sandbox Code Playgroud)
如果您需要它不透明,那么也提供 alpha 分量或将其替换0为1.
fixed4 transparent = float4(_Color.r, _Color.g, _Color.b, _Color.a);
Run Code Online (Sandbox Code Playgroud)
免责声明:
我不是着色器程序员,但这应该可以解决您的问题。