模型中多个材质的渲染顺序

模型中多个材质的渲染顺序

这是第157篇UWA技术知识分享的推送。今天我们继续为大家精选了若干和开发、优化相关的问题,建议阅读时间10分钟,认真读完必有收获。

UWA 问答社区:answer.uwa4d.com
UWA QQ群2:793972859(原群已满员)


本期目录:

  • 模型中多个材质的渲染顺序
  • SpriteRenderer的屏幕填充实现
  • iOS如何导出Log
  • Shader加载异常
  • Unity 2018.3.7版本开发中,模型在部分设备上无法显示

模型

在一个模型中,有两个默认材质。这个时候,如果用代码,强行增加一个材质,Unity会采用复制原材质中上一个材质的Mesh作为新材质的Mesh。所以有两个问题:

1)有没有可能为材质球指定Mesh;
2)如何才能让原材质的位置调换但是效果还是显示正确。

也就是让下图中两个材质球调换位置,并且效果显示正确;

请输入图片描述

第一个材质是颜色贴图材质,第二个材质是特效波动材质。

A:如果你的Mesh没有Submesh,多个材质球就是会渲染多遍,使用的对象就是当前的这个Mesh。如果有Submesh,我在编辑器模式下默认是不让增加材质球数量的,我不知道通过代码是否可行,但是如果可以通过代码添加但不能指认Mesh,是挺奇怪的。

关于顺序,RenderQueue相同的情况下,不透明和透明的排列顺序不同(不透明由近到远,因此可能认为数组顺序应该反着来做,透明的由远及近,按照数组顺序来),对于多材质的Mesh的材质渲染顺序似乎也不同。(注意,这里虽然RenderQueue设置到了半透明队列里,依然开启了ZTest和ZWrite)

所以,如果你想控制两个材质球的渲染顺序,就调整材质球的RenderQueue就好了,谁大谁就在后面。

请输入图片描述

请输入图片描述

最后,注意Unity给的Warning:

请输入图片描述

可以用多Pass来优化,甚至在一个Pass里通过宏来开关来控制(当然又要注意宏开关过多导致变体数量的问题……)

感谢贾伟昊@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cc6e87c5dad710abee804fc


渲染

Q:3D场景里的SpriteRenderer能否填充整个屏幕?我用一个正交摄像机专门照这个背景图,这个背景图是放在场景中的,能否让这个背景图自适应填充整个屏幕?

A:可以参考这篇文章:
UGUI研究院之在UI上使用RenderTexture显示模型+AlphaBlend特效(二十五)

功能有点类似,简单改造一下这个脚本就行。

自适应分两种,一种是拉伸的(图片会变形),另一种是不拉伸(图片会被裁切掉)。

感谢雨松MOMO@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cc2d7b7e08a260abaf021c7


编译

Q:iOS下怎么导出Log呢?我们Log文件写在Application.persistentDataPath下,iPhone上怎么找到这个文件呢?

A:建议参考这篇文章:
Unity3D研究院之IOS在Windows上查看日志就像Android的adb一样方便(一百零一)

我们在用这个工具,可以在Windows上看iOS日志很方便。

感谢雨松MOMO@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5c5422c32b3589332f1a4946


Shader

Q:我使用了LowPolyWaterv2这个插件,里面的一个Shader在场景中做了一个水面效果,遇到如下问题:

1)当这个Shader不打包成单独的AssetBundle包时,加载场景后水面显示正常;
2)当这个Shader打包成单独AssetBundle包,加载场景后显示的水效果异常,而且并不是Shader丢失。

请问Shader打包和不打包单独AssetBundle包会有什么不同逻辑吗?

A:主要区别在于对Shader变体的收集,单独打包Shader,需要手动选择变体,使用Unity自动收集会有丢失的现象。

感谢郑骁@UWA问答社区提供了回答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cbd6aafe08a260abaf02119


模型

Q:我在项目中使用的一个模型,版本为Unity 2018.3.7,发布以后在华为P30、mate10等机器上无法正常显示,再后续的测试中尝试修改模型法线、重新绑定等都未能解决,目前已经尝试过的很多方案,发现以下规律:

使用的材质为Standard(Specular setup)

1)模型在绑定的情况下单独导入,能正常显示;
2)模型添加绑定以后,无法正常显示;
3)绑定模型在导入Unity以后,在Inspector界面中的Model页面将Normals选择为none,能显示模型整体轮廓;
4)绑定模型在导入Unity以后,在Inspector界面中的model页面将Normals选择为import,或者Calculate,都无法正常显示;
5)将Unity导出设置是进行如下设置Player Settings -> Resolution and Presentation 中的Use 32-bit Display buffer* 以及 Disble Depth and Stencil* 全勾选或者全不勾选,均无法正常显示;
6)更换材质也无法正常显示;
7)降低版本,在Unity 5.2.3中尝试过,显示出来的模型是全黑色,没有贴图效果,材质自身给定的颜色也不显示(最好的情况,显示依旧不正常)。

请UWA社区的各位大神多多指点,先在此谢过!

A:暂时解决了这个问题,具体原因尚不是特别明确。

关于模型:
1)出问题的模型,在蒙皮前对模型的旋转上设置了一个关键帧;
2)出问题的模型,在蒙皮前模型的旋转存在非零数据;

关于设置:
Unity2018.3.7f1,在默认打包的时候勾选了GPU Skinning。

暂时的解决方法:
在Unity中反选GPU Skinning。

目前猜想:
感觉上是华为使用的Mali-G7X 的GPU在对这种模型进行计算的时候,在最开始计算初始bound pose的时候出现了错误,少计算了模型蒙皮的旋转信息。

尚存疑问:
在三维软件中对模型进行解除蒙皮,清空模型的所有信息,然后再进行绑定动画,仍然存在问题,这个暂时就不太清楚问题在什么地方,后续查找到以后再更新吧。

感谢题主席郭亮@UWA问答社区分享了该问答,欢迎大家转至社区交流:
https://answer.uwa4d.com/question/5cb87b8b5dad710abee80348


今天的分享就到这里。当然,生有涯而知无涯。在漫漫的开发周期中,您看到的这些问题也许都只是冰山一角,我们早已在UWA问答网站上准备了更多的技术话题等你一起来探索和分享。欢迎热爱进步的你加入,也许你的方法恰能解别人的燃眉之急;而他山之“石”,也能攻你之“玉”。

官网:www.uwa4d.com
官方技术博客:blog.uwa4d.com
官方问答社区:answer.uwa4d.com
官方技术QQ群:793972859(原群已满员)

封面图:
ImposterBaker:为Unreal引擎制作的Impostors生成插件