关于surface shader中 插值器数量过多问题的思考

作者在修改Unity中的T4M4Textureshader时遇到错误,原因在于使用了过多的纹理插值器。通过查看生成的代码,发现Unity自动合并了一些TEXCOORD,解决方法包括更改数据类型或提高shader目标版本。
摘要由CSDN通过智能技术生成

最近在改一个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 。不过上述的办法也可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值