关于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,用数组应该更加准确,虽然性能上会消耗一些。
仅此记录,希望帮到碰到同样问题的人。
- 关于t4m在红米上会有马赛克的问题的延伸
- 马赛克问题的探讨
- T4M 地形在Assetbundle中 LightMap无效果的解决方法
- 关于exec系列函数的文件路径问题及延伸
- 关于exec系列函数的文件路径问题及延伸
- 关于微软黑屏的"延伸"?
- 关于 HTML5 的延伸阅读:
- iframe的自动延伸问题
- ip igmp join-group 马赛克的问题
- 关于出现在服务器中配置的web,用浏览器打开出现关闭按钮消失或者字体马赛克乱码的问题
- 关于数组局部初始化的一些延伸
- IOS学习 关于stretchableImageWithLeftCapWidth的延伸
- 关于字符编码延伸出来的
- 关于jbd2的小延伸及-文件系统
- 关于memset的理解和一点延伸。
- 子线程使用FolderBrowserDialog的问题延伸
- 最短路径问题的延伸
- “如何读书、怎样考试”问题的延伸
- java 序列化serialize的小运用,密码加密存取
- css实现文本超出隐藏
- redis集群环境搭建以及java中jedis客户端集群代码实现
- Qt错误
- struct和typedef struct用法分析
- 关于t4m在红米上会有马赛克的问题的延伸
- QT信槽编程,QObject::connect: Cannot connect (null)报错的两种成因
- 从0开始学习 GITHUB 系列之「GIT 进阶」
- 适配器模式-Adapter Pattern 不兼容结构的协调——适配器模式(一):没有源码的算法库,适配器模式概述
- Android进阶之旅------>解决Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.g
- Enum类
- LeetCode 169. Majority Element
- 轮播图
- Java中equals和==的区别