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

Unity图形渲染的前置知识(很重要)

[复制链接]
发表于 2023-2-7 15:11 | 显示全部楼层 |阅读模式
开始学习渲染的各种疑问点
图形渲染的知识点非常多,很多同学开始学习渲染没几天就放弃了,我之前学习的时候也有很多疑惑点,比如
PBR 是什么?
为什么要搞个PBR?
BRDF是啥?
IBL是什么?
球谐光照是什么?
蒙特卡洛积分又是啥玩意?
怎么突然多出这么多概念?

如果你之前没研究过渲染就一头扎进去研究这些概念,我保证你没多久就放弃学习了。

关于渲染这块的内容有很多的书籍和教程,下面分别列举2个对新手比较友好的书籍和网址
1、Unity Shader 入门精要
2、LearnOpenGL CN

如果你看过上面两部分内容,我敢肯定你脑海里还是会有各种各样的疑问?

什么?没有疑问? 哦,那你一定是个大神,请接受我的膜拜

下面进入正题,请大家思考下面几个问题

1、光是什么?
2、我们为什么能区分颜色?
3、反射和折射是什么?
4、PBR是什么?
5、为什么搞出个PBR,有了PBR是不是传统的渲染模型就没用了呢?

前几个问题是不是看着挺简单,但是仔细想想又觉得不是那么回事了?

下面让我们仔细分析下这几个问题

一、光是什么?

我们上学的时候都学过,牛顿通过三棱镜可以将光分成彩色的光带,他将其称为光谱,牛顿还发现将有色光照在物体上能让物体呈现不同的色调,如果用物体本身的颜色的光照射,物体的颜色就会变得更亮,也就是说,物体会吸收不属于自己的颜色,然后反射我们所看到的颜色,同时他还发现纯色的光线是不能分解的,所以他得出结论,同一颜色属于同一种折射率,光的色散是在不同的折射率中产生的。

19世纪麦克斯韦非常痴迷对光的研究,在此之前法拉第发现了一个奇怪的物理现象,拿一块磁铁在同线圈附近运动的时候线圈上就会产生电流,而在线圈上通电后,线圈就会产生磁铁的特性,能让指南针发生偏移,这说明电和磁之间一定存在某种关联。

麦克斯韦想用数学精确描述,电场、磁场与电荷密度、电流密度之间的关系,他创造了四个偏微分方程,这就是最伟大的方程式之一, ”麦克斯韦方程组“,通过这组方程麦克斯韦发现,电和磁就是一种能量波,将这种能量称之为电磁波,并推导出一个惊人的结论,电磁波的传播速度与光是一样的。这说明光与电磁波本质上是同一种东西,光也是电磁波。

电磁波包括无线电波、红外线、可见光、紫外线、X射线、伽马射线、不同的电磁辐射拥有不同的波长和频率,电磁波频率越高,波长就会越短,其能量也就越高。

一般我们再说"光"的时候都是指可见光,可见光波长介于400 至 700 纳米之间,只占用电磁波频谱中非常小的波段。从物理的角度来说,所有这些电磁波除了波长和频率不一样之外其他性质都一样。他们都具有波粒二象性,也都遵循着真空中光速不变的原理。

爱恩斯坦进一步发现了光的本质,简单来说,光其实是能量的传播形式,爱恩斯坦将构成光的最小单位称为光量子,简称”光子“,光子是能量传输的基本粒子,当原子中的一个电子从激发态跌至低能态时,电子每一次跃迁就会释放一个光子,释放出的光子就是失去的能量,同时光子也能击中电子被电子吸收,使电子能够进入更高的状态。从宏观的角度看,变化的电子能量产生一个震荡的磁场,磁场又产生一个垂直的电场,两种场在空间中经前进传输能量,实际上任何零质量的粒子都只会以光速前进并且没有加速过程,也就是说从产生的瞬间光就已经是光速,没有加速的过程。根据爱恩斯坦的质能方程,即E = mc2 ,能量与质量是可以产生互换的。而光子又是能量传输的最小单位,所以说光是我们这个世界的基础,是宇宙最基本的组成部分之一。

在137亿年前,宇宙从一次大爆炸中从无到有,世间万物都从虚空中出现,所有的物质也是在光中诞生,有时候我就在想这和开机动作多么像啊,也许我们是电脑编程的结果。

跑偏了,通过上边的内容让我们弄清了光的本质,那我们为什么能区分颜色呢?

二、我们为什么能区分颜色?

“可见光的特别之处就是我们的眼睛正好能感知到这个频率的电磁波”,不过这并不是巧合,因为可见光是比较容易在水中传播的电磁波,而最原始的眼睛就是在水中进化出现的。我们能看到颜色其实就是眼睛对不同频率的电磁波的处理结果。

现实世界中有无数种颜色,每一个物体都有它们自己的颜色。我们需要使用(有限的)数值来模拟真实世界中(无限)的颜色,所以并不是所有现实世界中的颜色都可以用数值来表示的。然而我们仍能通过数值来表现出非常多的颜色,甚至你可能都不会注意到与现实的颜色有任何的差异。颜色可以数字化的由红色、绿色和蓝色三个分量组成,它们通常被缩写为RGB。仅仅用这三个值就可以组合出任意一种颜色。例如,要获取一个珊瑚红色的话,我们可以定义这样的一个颜色向量:(1.0f, 0.5f, 0.31f);

我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的颜色。换句话说,那些不能被物体所吸收的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色。例如,太阳光能被看见的白光其实是由许多不同的颜色组合而成的(如下图所示)。如果我们将白光照在一个蓝色的玩具上,这个蓝色的玩具会吸收白光中除了蓝色以外的所有子颜色,不被吸收的蓝色光被反射到我们的眼中,让这个玩具看起来是蓝色的。下图显示的是一个珊瑚红的玩具,它以不同强度反射了多个颜色。



你可以看到,白色的阳光实际上是所有可见颜色的集合,物体吸收了其中的大部分颜色。它仅反射了代表物体颜色的部分,被反射颜色的组合就是我们所感知到的颜色。

RGB 的局限性

RGB 是我们接触最多的颜色空间,由三个通道表示一幅图像,分别为红色(R),绿色(G)和蓝色(B)。这三种颜色的不同组合可以形成几乎所有的其他颜色。
RGB 颜色空间是图像处理中最基本、最常用、面向硬件的颜色空间,比较容易理解。
RGB 颜色空间利用三个颜色分量的线性组合来表示颜色,任何颜色都与这三个分量有关,而且这三个分量是高度相关的,所以连续变换颜色时并不直观,想对图像的颜色进行调整需要更改这三个分量才行。

自然环境下获取的图像容易受自然光照、遮挡和阴影等情况的影响,即对亮度比较敏感。而 RGB 颜色空间的三个分量都与亮度密切相关,即只要亮度改变,三个分量都会随之相应地改变,而没有一种更直观的方式来表达。

但是人眼对于这三种颜色分量的敏感程度是不一样的,在单色中,人眼对红色最不敏感,蓝色最敏感,所以 RGB 颜色空间是一种均匀性较差的颜色空间。如果颜色的相似性直接用欧氏距离来度量,其结果与人眼视觉会有较大的偏差。对于某一种颜色,我们很难推测出较为精确的三个分量数值来表示。
所以,RGB 颜色空间适合于显示系统,却并不适合于图像处理。

HSV 颜色空间


基于上述理由,在图像处理中使用较多的是 HSV 颜色空间,它比 RGB 更接近人们对彩色的感知经验。非常直观地表达颜色的色调、鲜艳程度和明暗程度,方便进行颜色的对比。
在 HSV 颜色空间下,比 BGR 更容易跟踪某种颜色的物体,常用于分割指定颜色的物体。

HSV 表达彩色图像的方式由三个部分组成:
Hue(色调、色相)
Saturation(饱和度、色彩纯净度)
Value(明度)

RGB的颜色空间和HSV的颜色空间表示是可以相互转换的,如图所示。



以上就是我们需要了解的关于颜色的相关知识。

三、反射和折射是什么?


当可见光与物体相交时会发生两种物理现象:散射和吸收。

光线会被吸收是由于光被转化成了其他能量,但吸收并不会改变光的传播方向。相反散射则不会改变光的能量,但会改变它的传播方向。

在光的传播过程中,光是沿直线传播的。但如果光在传播时介质的折射率发生了改变,光的传播方向就会发生改变。特别是,如果折射率是突变的,就会发生光的散射现象。


光在不同介质的边界会被分割成两个方向:反射方向和折射方向。而有多少百分比的光会被反射(另一部分被折射了)则是由菲涅耳等式来描述的。

说到这里突然让我想起来一个比较有意思的事,光纤传输过程为什么不会出现信息的丢失的问题?

这里就用到了反射的知识,由内部全反射原理可知,光脉冲很容易沿光纤线路运动,光纤内部全反射原理说明了当入射角超过临界值时,光就不能从玻璃中溢出。

话再聊回来,光在介质中传播中是比较复杂的,如果我们拿放大镜去观察物体表面时会发现很多肉眼不可见的凹凸不平的平面,这种情况下,物体的表面就会和光发生各种行为。

而折射到物体内部的部分一部分会被介质吸收,一部分又被散射到外面。这些被散射出去的光又被称为次表面散射光。

次表面散射光就是我们经常探讨的漫反射,而被反射的部分就是我们经常探讨的镜面高光反射。


这里次表面散射光还会衍生出次表面散射渲染技术,而我们知道现实世界是非常复杂的,一个物体的反射光还会对另一个物体产生影响(也就是间接光照),这又衍生出全局光照的相关技术(光线追踪,IBL,球偕光照,烘焙,光照纹理,光照探针等让你演化缭乱的名词是不是现在出现在了你的脑海中。。。)

现在我们对反射和折射有了清晰的认识。接下来我们看下一个问题

四、PBR是什么?为什么搞出个PBR,有了PBR是不是传统的渲染模型就没用了呢?


PBR是指基于物理的渲染(Physically Based Rendering),它指的是一些在不同程度上都基于与现实世界的物理原理更相符的基本理论所构成的渲染技术的集合。也就是说它是一种光照模型。

如果没了解PBR前,看到这个概念后我相信你只看懂了基于物理的渲染,并不清楚他到底有什么用。

再了解它之前,我们先聊聊标准光照模型。

1、标准光照模型

标准光照模型只关心直接光照,也就是哪些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。

它的基本方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算它的贡献度。这四个部分是:
1)自发光 , 这部分用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照技术,这些自发光的表面并不会真的照亮周围的物体,而是他本身看起来更亮了而已。
2)高光反射,这部分用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
3)漫反射,  这部分用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
4)环境光,  它用于描述其他所有的间接光照。

标准光照模型仅仅是一个经验模型,比如大家知道的phone光照模型、blinn-phone光照模型,也就是说它不完全符合真实世界中的光照现象。如:
1)很多重要的物理现象无法用Blinn-Phone模型变现出来,如菲涅耳反射。
2)Blinn-Phone模型是各项同性的,也就是说当我们固定视角和光源方向旋转这个表面时,反射不会发生任何改变。但有些表面时有各向异性反射性质的。如拉丝金属、头发等。
3)也不是能量守恒的,也就是说出射光线的能量永远不能超过入射光线的能量。

2、PBR的诞生



近些年来随着硬件设备的增强,玩家也越来越追求画面的表现效果,标准光照模型已经不能满足需求,由此PBR逐渐被应用于实时渲染中。

正因为基于物理的渲染目的,因此这种渲染方式与我们原来的Phong或者Blinn-Phong光照算法相比总体上看起来要更真实一些。除了看起来更好些以外,由于它与物理性质非常接近,因此我们(尤其是美术师们)可以直接以物理参数为依据来编写表面材质,而不必依靠粗劣的修改与调整来让光照效果看上去正常。使用基于物理参数的方法来编写材质还有一个更大的好处,就是不论光照条件如何,这些材质看上去都会是正确的,而在非PBR的渲染管线当中有些东西就不会那么真实了。

需要注意的是应用了PBR并不意味着渲染出来的画面一定是像照片一样真实的。PBR仍然只是对基于物理原理的现实世界的一种近似,这也就是为什么它被称为基于物理的着色(Physically based Shading) 而非物理着色(Physical Shading)的原因。

判断一种PBR光照模型是否是基于物理的,必须满足以下三个条件:

1) 基于微平面的表面模型。
2) 能量守恒。
3) 应用基于物理的BRDF。

本文不打算对PBR进行深入的讨论,只是想告诉读者为什么PBR突然出现了。如果想深入研究的话可以去看文中开头推荐的书和网站。

3、有了PBR是不是传统的渲染模型就没用了呢?


答案是 NO.

要回答这个问题,我们首先要搞懂 PBR 和 传统渲染模型的优缺点。

PBR
优点:
1、效果更加真实
2、只需要一个万能的shader就可以渲染相当一部分类型的材质,而不用为每个材质写一个特定的shader.
3、可以保证在各种光照条件下,材质都可以自然地和光源进行交互,而不需要我们反复调整材质参数。

缺点:
1、PBR往往需要更复杂的光照配合,例如大量使用光照探针和反射探针等,而且还要开启HDR以及必不可少的屏幕特效,如抗锯齿、Bloom和色调映射,对性能是个很大的消耗
2、对美术来说也是个挑战,制作过程中与传统的shader有很大不同,普通的法线纹理和高光发射纹理的组合不再适用,我们需要创建更细腻复杂的纹理集,包括金属值纹理、高光反射纹理、粗糙度纹理、遮挡纹理、有些还需要额外的细节纹理来给材质添加更多的细节表面。

传统渲染模型
优点:
1、美术创作简单、画面要求不高的场景这是一个不错的选择。
2、性能比较好
3、技术复杂度相对简单

缺点:
1、对一些场景不能满足游戏的品质要求,很多物理现象无法满足。
2、非能量守恒的
3、不是各向异性的

相信看了以上的对比大家心中有了大概的了解,比如UI界面或者要求不高的场景就用传统渲染模型就好,像游戏中人物的展示需要体现这个人的质感的时候这个时候用PBR就是个不错的选择。

总之具体问题具体分析,没有一个灵丹妙药能包治百病。

本文的内容就到此为止,具体的内容留给之后的文章介绍。

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-6-27 22:04 , Processed in 0.117226 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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