Unity Shader - 踩坑记录 - 修复模拟器模型中不显示,或显示异常,但是PC、手机上显示没问题 - uniform 变量多下划线开头,比如:__MainTex, __MainText_ST


问题

在之前的一篇文章中: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
}

做个记录,便于排坑,也便于后人搜索到类似问题,快速解决

扫描二维码关注公众号,回复: 14217036 查看本文章

在这里插入图片描述


初步判断

这个 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

猜你喜欢

转载自blog.csdn.net/linjf520/article/details/124805342