首页 > Unity3D频道 > 【Unity3D研究院之游戏开发】 > Unity3D研究院之使用SRP计算准确overdraw(一百零九)
2019
11-16

Unity3D研究院之使用SRP计算准确overdraw(一百零九)

最近在研究如何把overdraw统计成准确的数据值,让美术同学能直观的知道自己做的特效、场景、角色到底有多费,再加上好久没有写文章了,自己也有点心得今天就分享给大家并且希望可以后面一起讨论。

首先Unity的overdraw是不准确的,如下图所示,我们放两个不透明的物体,在SceneView切到overdraw菜单,居然产生了overdraw。

Unity3D研究院之使用SRP计算准确overdraw(一百零九) - 雨松MOMO程序研究院 - 1

不透明物体会写深度,默认是从后往前画的。那么按照上面的例子是不可能产生overdraw的。原因是当切到overdraw模式下unity会强制(无论透明还是不透明)都用另一个overdraw的shader渲染,直接 Blend One One然后关闭深度写入,所以就会出现上面的错误结果。

不透明物体大部分情况下是不会产生overdraw的,除非是自己改了RenderQueue。比如后面(白色)的物体深度设置RenderQueue=1999,前面(红色)的物体深度设置2000,那么此时才会真正产生overdraw。如果两个(白色、红色)RenderQueue一样都等于默认值2000的话是不会产生overdraw的。

在说说透明物体、透明物体一般是不写深度的,而且透明物体遵守“画家算法”是从后向前画的,如果只渲染透明物体那么在切到overdraw页签时unity渲染出来的区域就是准确的。

回到文章考开篇,我想做的是统计特效、场景、角色的渲染,实际应用场景存在透明物体+不透明物体混合排列的情况,所以计算出准确的overdraw就更重要了,于是我想起了SRP可编程渲染管线。

我们首先需要准备2个画overdraw的shader,一个是给不透明物体用的(写深度),另一个是给透明物体用的(关闭写深度)

OverDraw/OverDraw-Queue

OverDraw/OverDraw-Transparent

代码比较好理解就是 Blend One One 一层叠一层,然后fixed4(0.1, 0.04, 0.02, 0);就是那个看起来暗红色的颜色,如果blend多了就越来越红。

OverDrawRenderPipelineAsset.cs

Create->Rendering->OverDraw Render Pipeline 创建一个自定义的渲染配置文件,如下图所示,将新创建的配置文件绑定到SRPSetting中。

Unity3D研究院之使用SRP计算准确overdraw(一百零九) - 雨松MOMO程序研究院 - 2

OverDrawRenderPipeline.cs

OK,最后运行准确的overdraw已经统计完毕了。

Unity3D研究院之使用SRP计算准确overdraw(一百零九) - 雨松MOMO程序研究院 - 3

现在还有2个问题

1.如何把准确的overdraw统计出来?

我的做法是做了一个全屏的RT(避免太卡还是要乘系数),分别取一张overdraw的图,在取一张不带overdraw的图,在遍历两张图的像素值就可以计算出来填充率了。

2.如果项目已经是lwrp、urp、hdrp、怎么处理呢?

其实也简单,就是两个做一个合并就可以了,也可以在创建一个新的SRPSetting,统计overdraw的时候动态覆盖到setting上面,统计完了在还原回来。

不管怎么说,这两个问题我会在下篇文章里好好讨论,我们下篇见!衷心的希望大家可以一起讨论。

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

Unity3D研究院之使用SRP计算准确overdraw(一百零九)》有 1 条评论

  1. gao 说:

    请问下,有完整工程示例么?

留下一个回复

你的email不会被公开。