Unity_Shader初级篇_6_Unity Shader入门精要

本文深入介绍了Unity中Shader的基础知识,特别是光照模型的概念。从辐射度、散射和吸收开始,解释了漫反射、高光反射和环境光的计算原理。标准光照模型包括自发光、漫反射、高光反射和环境光四个部分。文中详细阐述了兰伯特定律在漫反射中的应用,以及Blinn-Phong模型简化高光反射计算的原理。在Unity中,环境光和自发光可以通过内置变量控制。最后,实践部分展示了如何在Unity Shader中实现逐顶点和逐像素的漫反射及高光反射效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

渲染总是围绕着一个基础问题:我们如合同决定一个像素的颜色?从宏观上来说,渲染包含了两大部分:决定一个像素的可见性,决定这个像素上的光照计算。而光照模型就是用于决定在一个像素上进行怎样的光照计算。
本章着重讲述光照模型的原理,因此实现的Shader往往并不能直接应用到实际项目中(直接使用会缺少阴影、光照衰减等效果)。

通常来讲,我们要模拟真实的光照环境来生成一张图像,需要考虑3中物理现象。
·首先,光线从光源(light source)中被发射出来。
·然后,光线和场景中的一些物体相交:一些光线被物体吸收了,而另一些光线被散射到其他方向。
·最后,摄像机吸收了一些光,产生了一张图像。

6.1 光源
我们使用辐照度(irradiance)来量化光。
这里写图片描述
光线由光源发射出来后,就会与一些物体相交。通常,相交的结果有两个:散射(scattering)吸收(absorption)
散射只改变光线的方向,但不改变光线的密度和颜色。而吸收只改变光线的密度和颜色,但不改变光线的方向。光线在物体表面经过散射后,有两种方向:一种将会散射到物体内部,这种现象被称为折射(refraction)透射(transmission);另一种将会散射到外部,这种现象被称为反射(reflection)。对于不透明物体,折射进入物体内部的光线还会继续与内部的颗粒进行相交,其中一些光线最后会重新发射出物体表面,而另一些则被物体吸收。那些从物体表面重新发射出的光线将具有和入射光线不同的方向分布和颜色。
这里写图片描述
为了区分这两种不同的散射方向,我们再光照模型中使用了不同的部分来计算他们:高光反射(specular)部分表示物体表面是如何反射光线的,而漫发射(diffuse)部分则表示有光线会被折射、吸收和散射出表面。根据入射光线的数量和方向,我们计算出射光线的数量和方向,我们通常使用出射度(exitance)来描述它。辐照度和出射度之间是满足线性关系的。而它们之间的比值就是材质的漫反射和高光反射属性。

着色(shading)指的是,根据材质属性(如漫反射属性等)、光源信息(如光源方向、辐照度等),使用一个等式去计算沿某个观察方向的出射度的过程。我们也把这个等式成为光照模型(Lighting Model)

BRDF(Bidirectional Reflectance Distribution Function) 光照模型,当给定模型表面上的一点时,BRDF包含了对该点外观的完整的描述。
著有《3D数学基础:图形与游戏开发》(英文名:《3D Math Primer For Graphics And Game Development》)的邓恩曾说过:
计算机图形学的第一定律:如果他看起来是对的,那么他就是对的。

6.2 标准光照模型
虽然光照模型有很多种类,但在早期的游戏引擎中往往只使用一个光照模型,这个模型被称为标准光照模型。实际上,在BRDF理论被提出之前,标准光照模型就已经被广泛使用了。
在1975年,著名学者裴凤祥提出了标准光照模型背后的基本理念。标准光照模型只关心直接光照(direct light),也就是哪些直接从光源发射出来照射到物体表面后,经过物体表面的一次反射直接进入摄像机的光线。
它的基本方法是,把进入到摄像机内的光线分为4个部分,每个部分使用一种方法来计算他的贡献度。这4个部分是:
·自发光(emissive),使用C(missive)来表示。这个部分用于描述当给定一个方向时,一个表面本身会向该方向发射多少辐射量。需要注意的是,如果没有使用全局光照(global illumination)技术,这些自发光的表面并不会真的照亮周围的物体,而是它本身看起来更亮了而已。
·高光反射(specular),使用C(specular)来表示。这个部分用于描述当光线从光源照射到模型表面时,该表面会在完全镜面反射方向散射多少辐射量。
·漫反射(diffuse),使用C(diffuse)来表示。这个部分用于描述当光线从光源照射到模型表面时,该表面会向每个方向散射多少辐射量。
·环境光(ambient),使用C(ambient)来表示。这个部分用于描述其他所有的间接光照。
环境光
虽然标准光照模型的重点在于描述直接光照,但在真实的世界中,物体也可以被间接光照(indierct light)所照亮。间接光照指的是,光线通常会在多个物体之间反射,最后进入摄影机,也就是说,在光线进入摄影机之前,经过了不止一次的物体反射。例如,在红地毯上放置一个浅灰色的沙发,那么沙发底部也会有红色,这些红色是有红地毯反射了一部分光线,再反弹到沙发上的。
在标准光照模型中,我们使用了一种被称为环境光的部分来近似模拟间接光照。环境光的计算非常简单,它通常是一个全局变量,即场景中的所有物体都使用这个环境光。下面的等式给出了计算环境光的部分: C(ambient) = G(ambient)
自发光
光线也可以直接由光源发射进入摄影机,而不需要经过任何物体的反射。标准光照模型使用自发光来计算这个部分的贡献度。他的计算也和简单,就是直接使用了该材质的自发光颜色:C(emissive)=C(emissive)
通常的实时渲染中,自发光的表面往往并不会照亮周围的表面,也就是说,这个物体并不会被当成一个光源。Unity5引入的全新的全局光照系统则可以模拟这类自发光物体对周围物体的影响。
漫反射
漫反射光照是用于对那些被物体表面随机散射到各个方向的辐射度进行建模的。在漫反射中,视角的位置是不重要的,因为反射是完全随机的,因此可以认为在任何反射方向上的分布都是一样的。但是,入射光线的角度很重要。
漫反射光照符合兰伯特定律(Lambert’s law):反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比。因此,漫反射部分的计算如下:C(diffuse)= (C(light)·M(diffuse))Max(0,n·L)
其中,n是表面法线,L是指向光源的单位矢量,M(diffuse)是材质的漫反射颜色,C(light)是光源颜色。需要注意的是,我们需要防止法线和光源方向点乘的结果为负值,因此,我们使用取最大值的函数来将其截取到0,这可以防止物体被从后面来的光源照亮。
高光反射(物体上最亮的那个点就是高光)
这里的高光反射是一种经验模型,也就是说,它并不完全符合真实世界中的高光反射现象。它可用于计算那些沿着完全镜面反射方向被反射的光线,这可以让屋头看起来是有光泽的,例如金属材质。
计算高光反射需要知道的信息比较多,如表面法线、视角方向、光源方向、反射方向等。我们假设这些矢量都是单位矢量。图6.3给出了这些方向矢量。
这里写图片描述
在这4个矢量中,我们实际上只需要知道其中3个矢量即可,而第4个矢量——反射方向可以通过其他信息计算得到
这里写图片描述
这样,我们就可以利用Phong模型来计算高光反射的部分:
这里写图片描述
其中,M(gloss)是材质的光泽度(gloss),也被称为反光度(shininess)。它用于控制高光区域的“亮点”有多宽,M(gloss)越大,亮点就越小。M(specular)是材质的高光反射颜色,它用于控制该材质对于高光反射的强度和颜色。C(light)则是光源的颜色和强度。同样,这里也需要防止这里写图片描述的结果为负数。
和上述的Phong模型相比,Blinn提出了一个简单的修改方法来得到类似的结果。它的基本意思是,避免计算反射方向这里写图片描述。因此,Blinn模型引入了一个新的矢量这里写图片描述,它是通过对这里写图片描述这里写图片描述的取平均后再归一化得到的。即
这里写图片描述
然后,使用这里写图片描述这里写图片描述之间的夹角进行计算,而非这里写图片描述这里写图片描述之间的夹角,如图6.4所示。
这里写图片描述
总结一下,Blinn模型的公式如下:
这里写图片描述
在硬件时间时,如果摄影机和光源距离模型足够远的话,Blinn模型会快于Phong模型,这是因为,此时可以认为这里写图片描述这里写图片描述都是定值时,因此 这里写图片描述将是一个常量。但是,当这里写图片描述或者这里写图片描述不是定值时,Phong模型可能反而更快一些。需要注意的是,这两种光照模型后都是经验模型,也就是说,我们不应该认为Blinn模型是对“正确的”Phong模型的近似。实际上,在一些情况下,Blinn模型更符合实验结果。

逐像素还是逐顶点
通常来讲,我们有两种选择:在片元着色器中计算,也被称为逐像素光照(per-pixel lighting);在顶点着色器中计算,也被称为逐顶点光照(per-vertex li

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值