最近在改一个T4M 4 Texture的shader,改完之后发现unity 的错误提示:
Shader error in ‘Standard-T4M-4’: Too many texture interpolators would be used for ForwardBase pass (11 out of max 10) at line 211
好吧,这是因为#pragma target 3.0 中使用的插值器太多了。看下Input 的结构:
struct Input
{
half2 uv_Control : TEXCOORD0;
half2 uv_Splat0 : TEXCOORD1;
half2 uv_Splat1 : TEXCOORD2;
half2 uv_Splat2 : TEXCOORD3;
half2 uv_Splat3 : TEXCOORD4;
half2 lightFaceUV : TEXCOORD5;
UNITY_FOG_COORDS(6)
};
看起来挺合理的,用了7个TEXCOORD 。既然提示用了11个插值器那么不得不看下“Show generated code”。
搜索 TEXCOORD10,嗯,果然是有的
// vertex-to-fragment interpolation data
// no lightmaps:
#ifndef LIGHTMAP_ON
struct v2f_surf {
UNITY_POSITION(pos);
half4 pack0 : TEXCOORD0; // _Control _Splat0
half4 pack1 : TEXCOORD1; // _Splat1 _Splat2
half2 pack2 : TEXCOORD2; // _Splat3
float4 tSpace0 : TEXCOORD3;
float4 tSpace1 : TEXCOORD4;
float4 tSpace2 : TEXCOORD5;
***half2 custompack0 : TEXCOORD6; // lightFaceUV***
float2 custompack1 : TEXCOORD7; // fogCoord
#if UNITY_SHOULD_SAMPLE_SH
half3 sh : TEXCOORD8; // SH
#endif
UNITY_SHADOW_COORDS(9)
#if SHADER_TARGET >= 30
float4 lmap : TEXCOORD10;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
#endif
这就过分了。通过这块可以看到,貌似unity会将half2 合并成half4。原来基于性能的考虑会这样声明half2 lightFaceUV : TEXCOORD5; 那么为了少用一个插值器,只能改类型了float2 lightFaceUV : TEXCOORD5;
改过之后错误消失编译通过了。
那么看改之后的 generated code:
// vertex-to-fragment interpolation data
// no lightmaps:
#ifndef LIGHTMAP_ON
struct v2f_surf {
UNITY_POSITION(pos);
half4 pack0 : TEXCOORD0; // _Control _Splat0
half4 pack1 : TEXCOORD1; // _Splat1 _Splat2
half2 pack2 : TEXCOORD2; // _Splat3
float4 tSpace0 : TEXCOORD3;
float4 tSpace1 : TEXCOORD4;
float4 tSpace2 : TEXCOORD5;
***float4 custompack0 : TEXCOORD6; // lightFaceUV fogCoord***
#if UNITY_SHOULD_SAMPLE_SH
half3 sh : TEXCOORD7; // SH
#endif
UNITY_SHADOW_COORDS(8)
#if SHADER_TARGET >= 30
float4 lmap : TEXCOORD9;
#endif
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
#endif
果然合并了:float4 custompack0 : TEXCOORD6; // lightFaceUV fogCoord 将我需要的lightFaceUV 和 fogCoord 合并到了一起。由于fogCoord 是unity自己的宏,我没法改他的定义。只能改lightFaceUV 了。
还有一种简单的办法是将#pragma target 3.0 改成3.5 。不过上述的办法也可以了。