Unity中depth pass的优化以及谈谈unity中的Framebuffer

这个问题的来源是我发现在unity在移动平台上为了得到深度图,通常需要一个单独的pass,例如我们用到的一些后处理特效需要用刀场景深度信息,我们通过把camera的flag设置为depth tex 打开,unity就会在每帧用一个单独的pass绘制深度图,这其实很浪费,我们队全场景的顶点提交了两次,增加了大量drawcall。为了说明解决这个问题的思路,我们从framebuffer说起。

0. 关于framebuffer

我们知道把场景渲染出来的过程,最终就是把图像绘制到一个FrameBuffer上的过程,现代gpu支持多个framebuffer,显示器屏幕的framebuffer是默认的fbo,当然除了显示器屏幕我们还可以渲染到其他自己定义的fbo来实现渲染到贴图等等。在unity中可以放置多个多个摄像机,这些摄像机在不同情况下渲染的目的fbo也是不一样的。

我们需要知道一个fbo包括很多位面,通常至少包括两个color buffer(前和后双缓存用来绘制和展示),一个depth buffer

我们可以在不同的framebuffer之间拷贝(gpu上的互拷),包括渲染拷贝color或depth,至于gpu到cpu的拷贝我们可以把framebuffer拷贝回cpu内存,但是只限于color位面(截屏),很多底层不支持depth的cpu回拷

默认被激活的fbo就是屏幕的那个fbo,当然也可以切换激活到自定义的fbo来实现向自定义fbo的绘制。

默认的屏幕那个fbo里面的buffer不能被更改,例如gles中它不有gles提供,二是由egl提供,但是自定义的fbo就可以更改里面的buffer

1. unity的camera的fbo的定向规则:

① 对于一个单个最简单的摄像机,它的渲染的fbo就直接是屏幕的fbo

② 对于多个简单摄像机,也是按照摄像机顺序先后流到屏幕fbo

③ 对于带有屏幕后处理特效的单个摄像机,渲染先流到一个自定义fbo,然后一层层的经过后处理,每层后处理都流向一个新的自定义fbo,直到最后一层后处理自动留到屏幕fbo,

④ 对个多个带有屏幕后处理特效的摄像机,按照摄像机的顺序逐个渲染,对于第一个摄像机,先渲染到一个自定义fbo,然后一层层的经过后处理,每层后处理都流向一个新的自定义fbo,对于后面的摄像机,显然渲染到上一个的摄像机的最后后处理出来的那个自定义fbo,也一层层后处理下去,直到最后一个摄像机的最后一层后处理,会流向屏幕fbo

2. 改变摄像机的fbo流向

有很多方法和很多理由需要改变摄像机的fbo,例如渲染到rendertexture,例如我们最开始的那个问题

① 直接创建一个rendertarget,然后赋给摄像机的target,这样这个摄像机(包括加过后处理特效)的最终流向就到了这个rendertexture,因为本质上rendertexture就是一个自定义的fbo

② 通过camera.settarget(color,depth).,可以分别设置color和depth的buffer,这在底层其实是新建了一个fbo,然后把它激活,但是你不能把color定向到屏幕,而depth定向到别处,因为color和depth的buffer必须待在一个fbo上,而屏幕的fbo中的buffer又不能被更改。

对于被设置了settarget而重定向了buffer的camera的渲染的流向规则比较奇特是这样的:

① 如果没有屏幕特效,它直接渲染到自定义的fbo上,屏幕上不可见

② 如果有屏幕特效,它直接渲染到自定义的fbo上,然后一层层的后处理,知道最后一层后处理直接流向屏幕,可以说在这种情况下和我们的预期有些不符,因为这种情况下我们的自定义的rt上没有屏幕特效,而屏幕上出现了

③如果有多个摄像机,每个都被定向到自定义的fbo,每个都有后处理特效,那么第一个摄像机先渲染到定向的那个fbo,然后每层特效后渲染到一个新的自定义的fbo,如果不是最后一个摄像机,最后一层特效将重新流向定向的那个fbo,而对于最后一个摄像机,最终流向屏幕fbo。也就是这种情况下定向的fbo少了最后一个摄像机的特效,而屏幕出现了完整的结果

3. 如何从屏幕获取depth tex?

回到这个问题。我们自然的会想到为什么unity不直接使用上一帧刚刚在屏幕上绘制好的那个framebuffer中的depth?答案肯定是完全可以,unity没有这样做可能是出于为了得到一个它可控的深度图,例如如果我们在渲染场景时自定义了一些z的操作,那么这个z的深度图可能不准,但是事实上对于不透明物体我们几乎不会干这种事。于是我打算从屏幕直接获取刚刚写过的那个depth,而强制unity不用这个浪费的单独的depth pass。

如何做到?最简单的是直接利用fbo的互拷贝的从屏幕的fbo拷贝过来到一个自定义的fbo,然而使用blit这种操作并不能稳定的获取屏幕的z,查阅一些资料也有说从屏幕fbo拷贝z在很多设备并不稳定。那么我反过来实现,我自定义两个buffer,一个color,一个depth,然后把unity的camera的渲染定向到自己的这两个buffer(为什么不只重定向depth?前面说到color和depth不能一个出于屏幕,一个出于自定义)。这样每帧绘制完透明物体后,我把depth的buffer拷贝出来就得到屏幕的z,可以给程序其他地方用了,当然最后当绘制完毕还要把color blit给屏幕,这样屏幕才看得见图像。这种做法相比多了一个从把color从自定义buffer blit到屏幕的操作,但是显然相比重新来一遍深度pass性能要高很多。

当然这里有个坑,那就是如果你的摄像机上有后处理特效,那么就不要自己最后blit color回去了,至于为什么可以参考上面2.2和2.3的规则

版权声明:本文为CSDN博主「leonwei」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/leonwei/article/details/73927878

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • 转自http://blog.csdn.net/xiajun07061225/article/details/728...
    不相忘123阅读 932评论 0 2
  • OpenGL首先我们从字面意思来理解:Open Graphics Library,开放的图形库,图形库自然是处理图...
    _清墨阅读 2,725评论 0 3
  • 这篇文章是对OpenGL ES之绘制三角形(一)的补充解释, 在这篇文章里会解释苹果封装的GLKView帮我们做了...
    冰三尺阅读 5,599评论 0 10
  • 我说要折九十九朵樱花花瓣。 我喜欢你。 是全世界都知道秘密。 你用最温暖的唇彩。 为我下...
    清依依阅读 331评论 4 9
  • 文|烽火长歌 01 我这人有些奇怪,也有一些奇怪的爱好,比如说:拍马屁。 当然了,一般人是享受不到我这种恶趣味的奉...
    烽火长歌阅读 897评论 6 12