因为项目中有换装系统,换装系统中有大量的可替换的脸部数据,比如眉毛,睫毛,腮红,眼影,口红等,需要十多个贴图通道。所以我们的shader中需要有十多张贴图通道

跑再android机器上时,一切都正常显示。但跑再iphone8时,就会发现材质丢失了

然后查到的报错信息是采样次数过多,机器不支持这个采样次数。iphone8是9个

基于这个问题,有两种解决方案

第一种:

把多个贴图合并,也就是再到gpu之前先把所有贴图合并成一个贴图,然后给gpu渲染一次。

var pixels = tex.GetPixels32();for (int j = 0; j < pixels.Length; j++){if (pixels[j].a != 0){if (j < colors.Length){var realJ = j;var newPixel = pixels[realJ] * (color * 255);var curColors = colors[realJ];var dstColors = Color32.Lerp(curColors, newPixel, (float)newPixel.a / 255.0f);colors[realJ] = new Color32((byte)(curColors.r > 0 ? (dstColors.r) : newPixel.r),(byte)(curColors.g > 0 ? (dstColors.g) : newPixel.g),(byte)(curColors.b > 0 ? (dstColors.b) : newPixel.b),(byte)(curColors.a > 0 ? (dstColors.a) : newPixel.a));}}}

写入shader:

var faceOtherShader = Shader.PropertyToID("_FaceOtherMap");bodymat.SetTexture(faceOtherShader, texture2d);

优点:这样减少了贴图数量,消耗也更少了,带宽消耗自然也更小了。

缺点:但这样做的问题是每次换装时都需要合并一次贴图,会有明显的卡顿,效果也并不是很好。

第二种

分两个材质放贴图

也就是第一个做光照模型的渲染,第二个做贴图渲染

尽量让两个材质的贴图采样个数都小于9个。让光照模型材质(AvatarMat)先渲染,贴图渲染(AvatarFaceTexture)后渲染。

然后跑到iphone8上,确实不会出现材质丢失的紫色了。

但是出现了一个问题:

就是腮红,嘴唇等都会闪烁。

然后看了下这张rt的alpha通道

越白说明alpha越高,可以看到眼睛旁边和嘴巴旁边都有半透明的效果。

查找原因:

看了下shader发现

Blend SrcAlpha OneMinusSrcAlpha

混合模式只用了这个。因为这个blend方式是也会把alpha通道做混合的。

然后我们进行分析

先渲染的avatarmat中是不透明的

但后面处理的avatarfacetexture里是有透明

然后混合用Blend SrcAlpha OneMinusSrcAlpha混合公式后得到的是一个带透明的效果,因为后面在处理的face时,因为alpha是不为1的,所以frontcolor*alpha+backcolor*(1-alpha)肯定得到的是一个半透明的值。

比如:

facetexture当前像素是(0.8,0.8,0.8,0.8)avatarmat的像素是(1,1,1,1)

计算过程:(0.8,0.8,0.8,0.8)*0.8+(1,1,1,1)(1-0.8)=(0.84,0.84,0.84,0.84)

也就是最后的alpha值是0.84,所以是透明的,所以会显示背景而导致半透明区域是闪烁的。

那么解决办法也很简单,就是区分color的混合和alpha的混合。

因为blend有一种模式可以区分color和alpha的混合。

Blend SrcFactor DstFactor, SrcFactorA DstFactorA

也就是前面两个是颜色混合,后面两个是颜色混合。正是我们想要的。所以最后的混合方式是

Blend SrcAlpha OneMinusSrcAlpha,One One

问题就解决了

当然这里还要注意FaceTextureshader要做小量的深度偏移,不然会跟身体重叠比较严重,导致闪烁发生

优点:切换贴图不会卡顿,顺畅过度

缺点:贴图采样数量还是一样多,所以会产生带宽过高的问题

以后的优化点可以考虑部分贴图合并减少贴图数量。

大量贴图采样限制下的渲染处理方法相关推荐

  1. 图形学中的贴图采样、走样与反走样等

    图形学中的贴图采样.走样与反走样等 https://blog.csdn.net/bugrunner/article/details/8829438 计算机图形学中不可避免的会涉及到图像分析与处理的相关 ...

  2. RF信号下采样/矩阵下采样(附python实现代码)

    之前对于RF信号下采样这个问题特别的懵,上采样我是知道的,其中一种方法就是对于矩阵插值,使得它具有更多的信息. 但是下采样,我查了很多资料,在知网上看到一篇论文(好像不是计算机领域的),他对于矩阵下采 ...

  3. maya阿诺德渲染失败_maya云渲染出图异常,Maya云渲染出图错误原因及解决方案

    maya出图异常处理插件配置错误 现象: 1.本地文件使用的arnold渲染器,平台上配置的是vray,类似于这种平台配置与本地使用不一致的情况 2.本地文件中用到的插件,在平台上没有配置 3.本地文 ...

  4. 华为手表哪款搭载鸿蒙系统,[图]华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表...

    原标题:[图]华为Watch GT 2渲染图曝光:首款搭载鸿蒙系统的智能手表 近日华为官宣将于9月19日在德国慕尼黑召开新品发布会,正式推出备受关注的新款旗舰Mate 30系列.与此同时华为还将会推出 ...

  5. 上采样、下采样、过采样、欠采样

    1. 过采样和欠采样 这是两种解决分类训练过程中数据量不平衡的采样方法 拿二分类举例,期望阳性样本数量:阴性样本数量 = 1:1,但实际上阳性样本数量:阴性样本数量 = 1000:100 过采样 将1 ...

  6. python使用imbalanced-learn的SMOTEENN方法同时进行上采样和下采样处理数据不平衡问题

    python使用imbalanced-learn的SMOTEENN方法同时进行上采样和下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜(c ...

  7. python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题

    python使用imbalanced-learn的SMOTETomek方法同时进行上采样和下采样处理数据不平衡问题 机器学习中常常会遇到数据的类别不平衡(class imbalance),也叫数据偏斜 ...

  8. 数据不平衡(class_weight、评估方法、上采样、下采样)、详解及实战

    数据不平衡(class_weight.评估方法.上采样.下采样).详解及实战 核心学习函数方法: np.random.choice() np.where() np.concatenate() np.v ...

  9. OpenCv 金字塔之上采样与下采样

    常见两类图像金字塔 高斯金字塔 ( Gaussian pyramid): 用来向下/降采样,主要的图像金字塔 拉普拉斯金字塔(Laplacian pyramid): 用来从金字塔低层图像重建上层未采样 ...

最新文章

  1. ORACLE分页SQL语句
  2. 小程序真的能帮商家挣到钱吗
  3. Django - 网页加载报错:A server error occurred. Please contact the administrator(亲测)
  4. 自定义路由匹配和生成
  5. html5如何实现播放下一首,使用HTML5 SoundCloud播放器小部件如何以编程方式跳到另一首曲目而不会导致播放第二不需要的曲目?...
  6. 【微信小程序】带你做一个公众号留言系统(附源码)
  7. 蓝桥杯 ALGO-63 算法训练 乘法表
  8. 网工考试——网络体系结构、物理层和数据通信
  9. php网站整合ck播放器,wordpress主题整合ckplayer播放器
  10. Oracle11.2.0.4升级补丁包
  11. 微信抢红包微信 PHP代码实现
  12. java新闻发布系统源代码_Java新闻发布系统源代码
  13. 如何做好科研实验记录
  14. html文本框隐藏按钮,隐藏input输入框的增减按钮
  15. 网站被劫持勒索怎么办
  16. openwrt web框架luci简介,20行代码写一个前后端交互页面
  17. linux断电并重启命令,Linux系统关机重启相关命令
  18. Linux内核框架之内核进程
  19. UTC时间与北京时间相互转换
  20. 计算机课件制作教程ppt,电脑制作ppt详细步骤_新手制作ppt详细步骤图文教程

热门文章

  1. Reading Comprehension必读paper汇总
  2. php 正则 零宽断言,正则表达式之零宽断言实例详解_正则表达式
  3. 通过网址自动网页截图(Selenium实现)
  4. 从虚拟化前端Bug学习分析Kernel Dump
  5. PowerMock使用-Mock私有方法
  6. 腾讯云mysql安装
  7. ESXi虚拟机导出为OVF模板
  8. 马明哲辞任中国平安CEO;Shake Shack将进驻中国华南首站深圳 | 美通企业日报
  9. 常见的GC算法(GC的背景与原理)
  10. Verilog AXI Components