问题
在之前的一篇文章中:unity shader - 圣斗士星矢 人物 shader 还原 - GPA 抓帧提取资源、shader,ROOT权限、救砖、ro.debuggable=1(最终还是RenderDoc无法抓帧)
我尝试了抓帧分析,并还原 圣斗士渲染效果
但是发现在以下部分平台的显示是不正常的:
- 模拟器上 - 不正常
- unity Editor - 正常
- PC - 正常
- Mobile - 正常
就唯独:模拟器上不正常
经过经 shader lab 中的逐行排查(废了半天时间)
发现 shader lab 中的 uniform 变量名中
一旦有 “__” 双下划线开头的,都会导致这个问题
比如:
// jave.lin : 示例代码
Shader "ThisIsShaderName"
{
HLSLINCLUDE
...
__MainTex;
// 比如,这个 Scale Offset 的内置变量,发布 apk 之后
// 放在模拟器上都会导致 渲染 显示异常
// 需要将 __MainTex, __MainTex_ST 修改位:_MainTex, _MainTex_ST
// 然后重新发布,再到模拟器下,才能正常
__MainTex_ST;
...
ENDHLSL
}
做个记录,便于排坑,也便于后人搜索到类似问题,快速解决
初步判断
这个 BUG,发生在多个不同的模拟器:mumu,夜神,等(我上面测试的就是夜神模拟器)
初步判断:既然多个模拟器都出现了相同的问题
应该是这些模拟器都有使用到一些通用的代码(相同的内核)
并且这部分的代码应该是和 shader 代码的生成 有关系的,可能 “__” 双下滑线是刚刚好一的一些内置关键逻辑有特殊的处理,才导致这个问题
我在 unity 官方文档上并没有查找到对应的资料:
比如:https://docs.unity3d.com/Manual/30_search.html?q=underscore
又如:I have a few ShaderLab questions
又或者是:Google 搜索:unity shader lab variables specifications 或是 unity shader lab undersocres
都没有相关的 more underscores 的特殊介绍
解决方案
- __MainTex -> 修改为 : _MainTex
- __MainTex_ST -> 修改为 : _MainTex_ST
解决工具
如果 shader 少,应用到的材质也少,那么可以使用下面的正则表达式放在:sublime 中逐个文件内容的手动替换替换
Find: ((__)([^_]))(\w+)
Replace : _$3$4
如果 shader 多,或是应用到有问题 shader 的材质过多,我们可以脚本化,写一些工具,批量文件的执行正则来替换其内容
Project
(不公开,备份用)
Test_SDX_Role_Shader_in_simulator_Compatible_u3d2018.2.11f1