首页 > Unity3D频道 > 【Unity2D研究院之游戏开发】 > Unity3D研究院之LWRP中计算准确overdraw(一百一十)
2019
11-24

Unity3D研究院之LWRP中计算准确overdraw(一百一十)

书接上文,在LWRP上Camera.SetReplacementShader是用不了的,而且就算能用算出来的不透明物体overdraw也是不对的。如果你的项目已经使用了LWRP,那么我们可以借助Custom Renderer Data来拓展渲染overdraw。如下图所示,需要自己创建一个自定义RendererData然后绑定到LWRP中。

Unity3D研究院之LWRP中计算准确overdraw(一百一十) - 雨松MOMO程序研究院 - 1

 

如下图所示,在自定义RendererData中需要声明两个材质,分别是渲染不透明、半透明物体的overdraw,材质的写法可以参考我的上一篇文章 Unity3D研究院之使用SRP计算准确overdraw(一百零九)

Unity3D研究院之LWRP中计算准确overdraw(一百一十) - 雨松MOMO程序研究院 - 2

OverDrawRendererData.cs

此时在GameView视图中就可以能看到OverDraw了,接下来就要具体分析了。

1.贴图有效率

Unity3D研究院之LWRP中计算准确overdraw(一百一十) - 雨松MOMO程序研究院 - 3

贴图有效率: 能看见渲染的像素/实际渲染的面积。

上面这个例子可以看出这个特效实际渲染的面积就是下面overdraw的区域,但由于贴图的透明区域比较大所以大部分的渲染面积都是白白浪费的。贴图有效率只能对单个特效进行统计,对多个particalSystem拼接成的是没有意义的。

最理想的情况下能看见渲染的像素/实际渲染的面积=1

2.像素覆盖率

Unity3D研究院之LWRP中计算准确overdraw(一百一十) - 雨松MOMO程序研究院 - 4

效率覆盖率:像素渲染的面积/像素渲染覆盖的面积。

像素渲染的面积应该比较好理解,就是每个暗红色的像素面积的总和,像素渲染覆盖的面积,就是假设每个暗红的像素值是1暗红的面积记作1,如果这个像素出现一次overdraw那么这个像素数面积就是1+1,如果多次overdraw这个像素的面积就记1+n,所有的像素面积加在一起就是像素渲染覆盖的面积。

最理想的情况下像素渲染的面积/像素渲染覆盖的面积=1 但是大多数情况下overdraw的次数会很多这个数值会更大

3.全屏覆盖率

全屏覆盖率:像素渲染覆盖的面积/屏幕的面积

屏幕的面积就是长X宽实际的像素数量,全屏覆盖率可以计算出每个特效实际的渲染压力,特效的消耗毕竟还是看渲染面积的。

最后还有2个问题

1.为了美术同学方便,我们需要保证GameView视图和SceneView视图中摄像机的朝向是一致的。

2.美术同学可能在场景中会放很多参照物,但是我们统计的时候是需要这些参照物了,所以要从SceneView视图中隐藏。图下图所示,进入统计模式时,脚本设置SceneView视图中只显示”TransparentFx”至于为什么选择这个,因为项目一般不会用到这个层,如果自定义一个新层还需要考虑多个项目通用问题。

Unity3D研究院之LWRP中计算准确overdraw(一百一十) - 雨松MOMO程序研究院 - 5

代码中能设置SceneView和GameView只看TransparentFx层

overdraw的工具我的计划是统计所有美术资源,包括 场景、角色、特效、争取给每个每个资源统计一个合理的分数,告诉美术同学做的资源渲染上到底有多费~ 同时也欢迎大家一起讨论。

最后编辑:
作者:雨松MOMO
专注移动互联网,Unity3D游戏开发
捐 赠写博客不易,如果您想请我喝一杯星巴克的话?就进来看吧!

Unity3D研究院之LWRP中计算准确overdraw(一百一十)》有 4 条评论

  1. Frank Lee 说:

    请问ResetOverDrawShader()和SetOverDrawShader()做了什么

  2. hill 说:

    overrideMaterial 会导致替换后的物体主贴图等属性丢失链接,这个问题请问你怎么解决?

  3. 雨松MOMO 说:

    升级到unity2019.3 URP 后 要添加 new ShaderTagId(“SRPDefaultUnlit”),

  4. wen 说:

    你好,有完整工程么?

留下一个回复

你的email不会被公开。