关于t4m在红米上会有马赛克的问题的延伸

来源:互联网 发布:nba体测数据查询 编辑:程序博客网 时间:2024/05/02 02:04

    很早就知道了t4m地表在电脑上是好的,红米上就会有马赛克。各种百度知道了要自己写一个shader,就可以了。但原因一直不明。

因为解决了问题,就没有深究。但今天碰到了一个水的shader,同样,电脑上很好,红米上又是马赛克。这次水的shader太过复杂,要自己重写一个顶点表面着色器不是很容易,于是我就回到以前那个简单的t4m着色器上,想看看问题到底出在哪。

通过不断的排除法,最后定位到最后几行代码的区别:

struct v2f_surf {
  float4 pos : SV_POSITION;
  float4 pack0 : TEXCOORD0;
  float2 pack1 : TEXCOORD1;
  fixed3 normal : TEXCOORD2;
  fixed3 vlight : TEXCOORD3;
  LIGHTING_COORDS(4,5)
};


 struct v2f

{
           half4 pos : SV_POSITION;
           float2 uv_Control : TEXCOORD0;
           float2 uv_Splat0[2] : TEXCOORD1;
};


前者是表面着色器t4m自动变成顶点着色器后的代码,这个是由unity自己处理的。

后面则是我自己写的顶点片段着色器。

然后看下用法:

o.pack0.xy = TRANSFORM_TEX(v.texcoord, _Control);
o.pack0.zw = TRANSFORM_TEX(v.texcoord, _Splat0);


o.uv_Splat0[0] = TRANSFORM_TEX(v.uv_Splat0, _Splat0);
o.uv_Splat0[1] = TRANSFORM_TEX(v.uv_Splat0, _Splat1);

区别就是,前者用xz存第一张图的uv,用zw存第二张图的uv。

后者用float2数组存两张图的uv。

既然前者有马赛克,说明xy并没有到达flaot2的精度。

也就是说在红米上TEXCOORD0可能只有16位。那么float4的pack0,其中的xyzw总共16位,而xy则只有8位。

而后者用数组的形式,依然是16位。两者精度相差了256倍。

豁然开朗。不过好奇为什么unity自动生成的是通过flaot4来存储多个uv,用数组应该更加准确,虽然性能上会消耗一些。

仅此记录,希望帮到碰到同样问题的人。

0 0