(五)unity自带的着色器源码剖析之——————前向渲染和延迟渲染

本文深入探讨了Unity中的前向渲染和延迟渲染技术。前向渲染适合简单场景,但面临大量光源时性能下降。延迟渲染通过先存储几何信息再进行光照计算解决这一问题,但对硬件要求较高且不支持反走样和半透明物体。Unity支持多种渲染路径,可按需求在不同摄像机间切换渲染模式。
摘要由CSDN通过智能技术生成

一、前向渲染概述

传统的渲染方式下所做的光照计算流程称为前向渲染。这是一种十分直接的方式,在顶点着色器中对所有待渲染对象的顶点进行一系列的变换,这些变换通常是将顶点的法线和位置变换到裁剪空间。如果采用逐片元光照的方式,在渲染每一帧时,每个片元都要执行一次片元着色器的代码,这时需要将所有的光照信息都传递到片元着色器中。虽然在大部分情况下的光源都趋向于小型化,而且其照亮的区域也不大,但即便是光源离这个像素所对应的世界空间中的位置很远,但当片元着色器中计算光照时,还是会把所有的光源都考虑进去。例如场景中有n个光源,那么在每一个片元执行着色器代码时,都必须把这n个光源都传递进着色器去执行光照计算。

前向渲染的方式比较容易理解,但却有一些性能上的缺陷:

1.首先不能很好地支持场景中存在大量的光源,试考虑场景中有几十上百个光源时,片元着色器要做的运算量非常大。

2.其次,如果待渲染的场景十分复杂,里面包含了大量的待渲染对象,将不可避免地产生“在屏幕中同一个像素中,其实会被多个物体所对应覆盖”的情况,即有很大的深度复杂度,我们会浪费很多GPU资源。例如,如果某像素的深度复杂度值为n,表示在每一帧中,这个像素上将有n个待渲染对象,进行了n次光照计算,而后绘制(即写入该像素的颜色值)。但其实有n-1次的光照计算及绘制是无用的,因为只有最靠近摄像机的那个待渲染对象的计算及绘制才会被最终显示到屏幕上。

二、延迟渲染概述

延迟渲染的出现就是为了解决上述问题,关键思想是把大部分光照计算等计算量很大的操作,延迟或者推迟到尽可能后的阶段中进行。与在前向渲染中总是将所有的待渲染对象从顶点缓冲区一路线性地渲染到最后的颜色缓冲区的流程不同,延迟渲染将这个过程拆分成了两个处理通路(pass)。

1.第一个处理通路称为几何处理通路。在此处理通路中,首先将场景渲染一次,获取到待渲染对象的各种几何信息,如位置向量、颜色向量、法线向量、深度值等,并且会把这些几何信息存储到名为几何缓冲区。即G-buffer缓冲区(geometry buffer)中,这些缓冲区将会在之后用做更复杂的光照计算。由于有深度测试,所以最终写入G-buffer中的各个数据都是离摄像机最近的片元的几何属性。这意味着所有不会出现最终屏幕上的片元都在深度测试中被丢弃,最后会被留在G-buffer中的片元都是必定要进行光照计算的。下图是G-buffer在某一帧的画面:

G-buffer在本质上和一个普通纹理类似,因此可以使用对纹理进行

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值