"incorrect number of arguments to numeric-type constructor at line" Unity 着色器错误
"incorrect number of arguments to numeric-type constructor at line" error in shader, Unity
在 github 上找到了一个带有着色器的 Unity 软体资产。由于对Unity shaders的了解有限,不知道上述错误是什么意思。
代码(第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
}
}
}
问题可能出在 float3(_Color),因为参考资料说它需要 2 个参数,而你只给出一个_颜色
我与着色器没有太多关系,所以将其视为可以帮助解决此问题的东西,但不必:
float3 variable = float3(_Color, 0);
float4(变量, 0);
尝试在 float3 或 float4 构造函数中的逗号后添加额外的 0,它可能是 3 维的,因此需要 x、y 和 z
您的代码中有两处错误:
1。您正在使用 float3(_Color)
.
将一个参数传递给 float3
2。您正在使用 float4(float3(_Color),0)
.
将两个参数传递给 float4
float3
有 3 个参数,而 float4
和 fixed4
有 4 个参数。我认为名字就是这样。
您必须将每个单独的颜色分量(_Color.r
、_Color.g
、_Color.b
)传递给 float3
,然后用它创建 float4
。
那行代码应该是:
fixed4 transparent = float4(float3(_Color.r, _Color.g, _Color.b),0);
请注意 _Color.a
(alpha) 缺失。这就是它透明的原因,因为 alpha 设置为 0
.
我真的不认为这里需要 float3
所以这也应该有效:
fixed4 transparent = float4(_Color.r, _Color.g, _Color.b, 0);
如果您需要它是不透明的,那么也提供 alpha 组件或将 0
替换为 1
。
fixed4 transparent = float4(_Color.r, _Color.g, _Color.b, _Color.a);
免责声明:
我不是着色器程序员,但这应该可以解决您的问题。
_Color 中有 4 个通道,但它位于 float3 中,这会给您带来错误。所以
尝试:
fixed4 transparent = float4(float3(_Color.rgb), 0);
或更好:
fixed4 transparent = float4(_Color.rgb, 0);
因为您不必将 float3 转换为 float3。
在 github 上找到了一个带有着色器的 Unity 软体资产。由于对Unity shaders的了解有限,不知道上述错误是什么意思。
代码(第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
}
}
}
问题可能出在 float3(_Color),因为参考资料说它需要 2 个参数,而你只给出一个_颜色
我与着色器没有太多关系,所以将其视为可以帮助解决此问题的东西,但不必:
float3 variable = float3(_Color, 0);
float4(变量, 0);
尝试在 float3 或 float4 构造函数中的逗号后添加额外的 0,它可能是 3 维的,因此需要 x、y 和 z
您的代码中有两处错误:
1。您正在使用 float3(_Color)
.
float3
2。您正在使用 float4(float3(_Color),0)
.
float4
float3
有 3 个参数,而 float4
和 fixed4
有 4 个参数。我认为名字就是这样。
您必须将每个单独的颜色分量(_Color.r
、_Color.g
、_Color.b
)传递给 float3
,然后用它创建 float4
。
那行代码应该是:
fixed4 transparent = float4(float3(_Color.r, _Color.g, _Color.b),0);
请注意 _Color.a
(alpha) 缺失。这就是它透明的原因,因为 alpha 设置为 0
.
我真的不认为这里需要 float3
所以这也应该有效:
fixed4 transparent = float4(_Color.r, _Color.g, _Color.b, 0);
如果您需要它是不透明的,那么也提供 alpha 组件或将 0
替换为 1
。
fixed4 transparent = float4(_Color.r, _Color.g, _Color.b, _Color.a);
免责声明:
我不是着色器程序员,但这应该可以解决您的问题。
_Color 中有 4 个通道,但它位于 float3 中,这会给您带来错误。所以 尝试:
fixed4 transparent = float4(float3(_Color.rgb), 0);
或更好:
fixed4 transparent = float4(_Color.rgb, 0);
因为您不必将 float3 转换为 float3。