"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 个参数,而 float4fixed4 有 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。