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
相关产品推荐
相关产品推荐

