找回密码
 立即注册
查看: 464|回复: 0

8个问题轻松掌握Unity前向渲染

[复制链接]
发表于 2021-3-26 07:55 | 显示全部楼层 |阅读模式
版权申明:

    本文为“优梦创客”原创文章,您可以自由转载,但必须加入完整的版权声明更多学习资源请加QQ:1517069595获取(企业级性能优化/热更新/Shader特效/服务器/商业项目实战/每周直播/一对一指导)本文视频链接:8个问题轻松掌握Unity前向渲染
引言

   今天想给大家分享的主题是8个问题轻松掌握Unity前向渲染。网上的很多资料或多或少讲到了前向渲染的用法,却没有讲到根本的问题:前向渲染路径是用来干什么的?它是用来解决什么样的图形问题?Unity为什么要在引擎中集成前向渲染路径这种光照渲染的解决方案?
   这里做下自问自答,前向渲染路径是Unity为了解决多光源条件下,正确表现多光源光照效果而设置的一种解决方案。大家都知道多光源环境效果是很复杂的,首先要考虑多种不同的光源类型,还需要考虑诸如光源数量,不同光源效果的叠加,以及由于这些光源效果的叠加,所产生的阴影效果的叠加,最后还需要考虑进行全局光照的烘培和全局实时光照的渲染,需要让逐色器/渲染程序适配前向渲染引擎,设计来解决多光源环境下前向渲染的解决方案。
   下面我就以技术问答的形式,为大家详解前向渲染的前世今生。只有我们理解了这种渲染路径的设计思路,才能把前向渲染正确地运用在项目之中;相反的,对于程序同学,如果不能正确使用前向渲染,对于程序的性能所造成的损失是无法估量的。对于技术美术同学,如果不能正确考虑光照的各种因素,正确地开发基于前向渲染的Shader,也不能称之为合格的技术美术。
   今天的课程同时适用于,有一定Unity基础想进阶游戏开发主程的同学,也适用于想要从Unity基础的美术开发进阶游戏技术美术的同学。
8个问题轻松掌握Unity前向渲染

主题: 什么是前向渲染路径 如何正确理解和运用前向渲染路径 如何在前向渲染路径下实现光照效果
1。 场景内有多盏灯光,应该如何渲染每盏灯光对物体的影响?

大家可以假设你要去做一个游戏引擎,这个引擎需要考虑场景内多盏灯光对一个物体照射的情况,每盏灯光都会对这个物体造成影响,你会怎样设置引擎的算法呢?
前向渲染的解决方案是:把每个物体用每盏灯光渲染一边,再将渲染结果混合起来
2。 Unity有几种光照渲染模式?



首先给大家看个图,大家觉得图上左右两边哪个更细腻呢?实际上右边的光照效果更细腻些。在蓝色灯光和红色灯光的过渡细节比较丰富。而左边的图在地面上所呈现的光照并没有亮暗的变化,在蓝色和白色的交界处,细节也很不明显。
   实际上这就反映了Unity中两种不同的光照渲染模式:逐像素和逐顶点。
   而另一种渲染方式球谐函数的光照渲染效果更差,采样率更低。
总结:Unity对物体进行光照渲染的时候有三种方式:逐像素/逐顶点/球谐函数
3。 每种渲染方式的性价比如何?

   逐像素的效果最好,逐顶点次之,球谐函数最差。性能开销则反之。
3。1 逐像素/逐顶点光照在前向路径种的渲染算法

逐顶点分别计算三角形三个顶点的光照值,三角形最后呈现的颜色通过颜色差值进行过渡。逐像素一个像素一个像素渲染,效果比逐顶点精细得多。
对模型中的每一个三角形,三角形中的每一个片元进行运算,进行深度测试判断像素点是否需要运算,如果需要就进行光照运算。传入一些物体的材质信息、法线信息、光照信息、摄像机方向的信息等,算出一个颜色,最后更新到帧缓存中。
    逐顶点 就是将片元运算 改为顶点运算
4。 Unity对每盏灯光都采用逐像素渲染吗?

以上图为例,我们假设八盏灯光都可以照射到这个白球上。如果场景里有2个物体,那么需要渲染8X2遍;3个物体8X3遍。。。。100个物体8X100遍,这样渲染显然是不可能的。
实际上Unity不会每盏灯光都去逐像素渲染,而是允许我们在项目设置里设置下最大允许像素光数量。默认设置为4盏,一般在开发手机游戏等商业项目时,我们仅设置为1盏,甚至通过优化和替代的方式,设置为0盏。以得到更低的性能开销和更好的渲染效果。
5。 Unity如何确定哪些灯光是逐像素的?

Unity是通过参加光照的灯光照到物体表面的亮度来确定哪些灯光是需要逐像素渲染的。
以上图为例,A-H八盏灯光亮度相等的情况下,假设设置了4盏像素光的话,很显然ABCD会作为逐像素进行渲染。
6。 顶点光照也有一定开销,Unity在这块有没有限制



那么剩下的灯光会怎么进行渲染呢?我们知道Unity还有逐顶点和球谐函数两种渲染方式。球谐函数的性能开销几乎可以忽略不记,但是逐定点是有性能开销的,那么Unity对此有没有限制呢?
实际上Unity默认Built-in管线采用的光照渲染方式是顶点光照最多4盏,其余统一按照球谐处理。
以上图灯光为例,ABCD逐像素,DEFG逐顶点,GH球谐处理。通过这样的渲染方式处理,来保证渲染效能只是与设置的像素光数量紧密相关。
7。 一个物体同时受到像素和顶点光照如何处理?



假设在基础通道里对所以物体用红色进行渲染,逐像素的光照在额外的绿色的叠加通道进行渲染,最终我们的物体最终渲染出的结果是黄色。
在图形学上红色(1,0,0) + 绿色(0,1,0) =黄色(1,1,0)
总结:Unity会先走基础通道渲染顶点光照,再通过叠加通道渲染像素光照
8。 能否强制Unity采用像素光照或顶点光照?



假设某一盏灯光在场景里很重要,能否强制Unity将它设置为逐像素光照;或者某盏灯光在场景里无关紧要,能否强制设置为逐顶点以节省性能开销呢?
实际上是可以的,设置灯光为Import(会采用像素光照)或Not Import(会采用顶点光照或球谐光照),可以实现所需要的效果。
需要注意的是:
假设只设置了一盏像素灯光,又采用了默认4盏像素灯光的设置,那么此时会有3盏灯光加入到逐像素光照,直到达到最少的像素光照数量要求。而不管设置多少Not Important灯光,Unity最多只会选择4盏最亮的或者Unity自己决定的4盏灯光进行顶点光照处理,剩下的灯光都走球谐函数处理。这就是Unity为了防止滥用像素或顶点光照而做的数量限制。
Unity官方使用的判断规则



渲染路径的设置

project setting - graphics - rendering path 设置 forward 前向渲染(取消勾选use default)
主角模型可以在camera - rendering 单独设置、
课程宣传与VIP服务



    Unity小白的游戏梦:面向零基础、想要入行游戏的同学Unity主程进阶之路:面向有开发基础、工作几年寻求突破的开发者Unity小白的TA之路:面向想要成长为技术美术的开发者Cocos小白的游戏梦:面向想要开发微信、抖音等平台小游戏,赚第一桶金的同学

    专属定制学习计划讲师一对一指导解决学习与开发过程中遇到的问题思路、架构、性能优化、源码管理。。。等方面指导每周直播工坊项目实战单一方向课程2年一对一服务,大师课程4年一对一服务VIP同学圈与企业内推就业与创业指导

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-20 18:46 , Processed in 0.065022 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表