You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity Portal Shader报错:numeric-type constructor参数数量不正确

Unity Portal Shader 参数数量错误排查与解决

报错情况

制作Portal Shader时遇到incorrect number of arguments to numeric-type constructor错误,报错位置如下:

fixed4 frag (v2f i) : SV_Target
{
    fixed2 uvs = fixed2(i.uv.x, i.uv.y + (_Time.y * _Speed)); <ERROR 1>
    fixed4 col = tex2D(_MainTex, i.uv);

    UNITY_APPLY_FOG(i.fogCoord, col);
    return fixed4(col.rgb * _Color.rgb, col.a * i.uv.y * _Intensity); <ERROR 2>
}

开发者认为两处代码参数数量符合要求(ERROR1传入2个参数给fixed2,ERROR2传入4个分量给fixed4),但修改类型后仍报错。注释问题代码后Shader可运行但缺失功能,完整Shader代码如下:

Shader "Unlit/Shader_PortalVortex"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
        _Intensity ("Intensity", Range(0, 1)) = 1
        _Speed ("Speed", Range(0, 1)) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Transparent+2"}
        ZTest Greater
        Blend SrcAlpha OneMinusSrcAlpha
        Cull Front
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float4 _Color;
            float4 _Intensity;
            float4 _Speed;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                //fixed2 uvs = fixed2(i.uv.x, i.uv.y + (_Time.y * _Speed));
                fixed4 col = tex2D(_MainTex, i.uv);

                UNITY_APPLY_FOG(i.fogCoord, col);
                //return fixed4(col.rgb * _Color.rgb, col.a * i.uv.y * _Intensity);
            }
            ENDCG
        }
    }
}

问题根源

错误核心是变量类型不匹配:

  • Properties中_Intensity和_Speed是Range类型(单值浮点),但CG代码中被声明为float4(四维向量)。
  • ERROR1中,_Time.y * _Speed是单值乘四维向量,结果为float4,而fixed2的第二个参数需要单值,导致构造函数接收了四维向量而非单个数值,触发参数数量错误。
  • ERROR2中,col.a * i.uv.y * _Intensity同样是单值乘四维向量,结果为float4,而fixed4的第四个参数需要单值,同样引发构造函数参数数量不匹配。

修复方案

将CG代码中的_Intensity和_Speed类型从float4改为float:

// 原错误代码
float4 _Intensity;
float4 _Speed;

// 修改后
float _Intensity;
float _Speed;

同时恢复之前注释的功能代码,修正后的frag函数如下:

fixed4 frag (v2f i) : SV_Target
{
    fixed2 uvs = fixed2(i.uv.x, i.uv.y + (_Time.y * _Speed));
    fixed4 col = tex2D(_MainTex, uvs);

    UNITY_APPLY_FOG(i.fogCoord, col);
    return fixed4(col.rgb * _Color.rgb, col.a * i.uv.y * _Intensity);
}

完整修复后的Shader代码

Shader "Unlit/Shader_PortalVortex"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1, 1, 1, 1)
        _Intensity ("Intensity", Range(0, 1)) = 1
        _Speed ("Speed", Range(0, 1)) = 0.5
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Transparent+2"}
        ZTest Greater
        Blend SrcAlpha OneMinusSrcAlpha
        Cull Front
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;
            float4 _Color;
            float _Intensity;
            float _Speed;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                fixed2 uvs = fixed2(i.uv.x, i.uv.y + (_Time.y * _Speed));
                fixed4 col = tex2D(_MainTex, uvs);

                UNITY_APPLY_FOG(i.fogCoord, col);
                return fixed4(col.rgb * _Color.rgb, col.a * i.uv.y * _Intensity);
            }
            ENDCG
        }
    }
}

内容的提问来源于stack exchange,提问作者ninthtale

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 05:27:53