【光照基础】颜色向量、光照模型(冯氏&布林冯)、着色频率

目录

颜色向量(R,G,B)

颜色向量的乘积

冯氏光照模型

计算环境光照

计算漫反射光照

计算镜面光照

布林-冯光照模型

着色频率


颜色向量(R,G,B)

我们常以三维向量(R,G,B)来表示颜色,如珊瑚红色可被表示为(1.0,0.5,0.31)。向量中的三个数字,分别代表了对红光、绿光、蓝光的反射能力的大小。也就是说,一个物体如果能反射100%的红光、50%的绿光和31%的蓝光,那么这个物体就呈现出珊瑚红色。这与我们的日常认知也相契合:能反射全部光的物体是白色的,而白色的颜色向量是(1,1,1)。

颜色向量的乘积

判断颜色为(1,0.5,0.5)的物体被颜色为(0.5,1.0,0.5)的光照耀后呈现出哪种颜色,在直觉上是件难事,但在数学上却只需要简单地将两个颜色向量相乘:物体呈现出RGB为(1,0.5,0.5)*(0.5,1.0,0.5)=(0.5,0.5,0.25)的颜色。

实际上这也很符合我们的经验,白光照耀在任何物体上物体的颜色都没有改变,而任何颜色向量乘(1,1,1)都是它本身。

冯氏光照模型

现实世界的光照是极其复杂的,而且会受到诸多因素的影响,这是我们有限的计算能力所无法模拟的。冯氏光照模型(Phong Lighting Model)是一个较为简化的模拟光照的数学模型,它将光照分为三类:环境光照(Ambient)漫反射光照(Diffuse)镜面光照(Specular)。对冯氏光照模型中的计算环节进行优化,还提出了布林冯光照模型,两者大同小异。

  • 环境光照(Ambient Lighting):即使在黑暗的情况下,世界上通常也仍然有一些光亮(月亮、远处的光),所以物体几乎永远不会是完全黑暗的。为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。

  • 漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是冯氏光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。

  • 镜面光照(Specular Lighting):模拟有光泽物体上面出现的亮点。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。

计算环境光照

为了以最简单的方式达到看起来还行的效果,我们使用一个很暗的常量颜色来代表环境光,这样即便场景中没有直接的光源也能看起来存在有一些发散的光。这个常量颜色应该与物体和光源的颜色都有关,因此计算公式如下:

环境光照 = 系数 * 光源颜色 * 物体颜色

这个系数应该被定义在(0,1)之间,一般设置为0.1就差不多了。

计算漫反射光照

漫反射光照能对物体产生显著的视觉影响,它的计算基于这个道理:物体上与光线方向更垂直的面能从光源处获得更多的亮度。就如同中午比早上热是因为中午太阳直射一样,光线直射的面能获得更多能量,也就看起来更亮。

以简单的数学模型概括光源和物体的位置关系,可以看这张图:

图中黄色的向量N垂直于物体表面,我们称其为法向量(Normal Vector)。θ是光线方向与法向量的夹角,θ越小,表面获得的能量越多,表面也就越亮。漫反射计算公式是一个关于θ的函数,它的计算公式如下:

漫反射光照 = 系数 * 光源颜色 * 物体颜色 * cosθ

然而在实际求解中,我们往往不会直接知道θ的值,而是要通过光线的方向向量l和物体表面的法向量n求解。这很简单,只需要将n和l化为单位向量后进行点乘即可。还考虑到cosθ有可能为负数,这在计算光照时是不需要的,此时漫反射光照应为0,所以扩展后的漫反射计算公式如下:

漫反射光照 = 系数 * 光源颜色 * 物体颜色 * max(dot(n,l),0)

计算镜面光照

我们通过根据法向量翻折入射光的方向来计算反射向量。然后我们计算反射向量R与观察方向的角度差θθ越小,镜面光的作用就越大。由此产生的效果就是,我们看向在入射光在表面的反射方向时,会看到一点高光。镜面反射计算公式同样是一个关于θ的函数:

镜面反射光照 = 系数 * 光源颜色 * 物体颜色 * (cosθ)^s

这个系数同样应该被设置在(0,1)之间,它控制了镜面反射光照的亮度,一般设置为0.5可能就差不多了。cosθ的指数s也是一个可以自由指定的数字,它控制了高光区域的大小,称为反光度(shininess)。s越大,高光区域越小。可以这样理解:在系数、光源颜色、物体颜色都一样的情况下,若要保持镜面反射光照恒定,s越大是θ应该越小,而越小的θ也代表越小的高光区域。

将环境光、漫反射、镜面光照相加,就得到了完整的冯氏光照模型的计算公式,也即:

颜色= 环境光照 + 漫反射光照 + 镜面光照                         

= 环境光照系数 * 光源颜色 * 物体颜色               

                 + 漫反射系数 * 光源颜色 * 物体颜色 * max(dot(n,l),0)

          + 镜面光照系数 * 光源颜色 * 物体颜色 * (cosθ)^s

布林-冯光照模型

布林-冯氏光照模型(Blinn-Phong Lighting)是对冯氏光照模型的优化,差异在于计算镜面光照时改变了计算的夹角。

布林-冯光照模型不再计算反射光线与观察方向的夹角θ,而是计算光线与观察方向的半程向量h和法向量n的夹角α,其他的计算公式都没有改变。所谓半程向量,即光线与视线夹角一半方向上的一个单位向量。

布林-冯模型修复了冯氏模型中高光断层的情况,如下图:

着色频率

根据光照模型计算每个点的颜色的过程称为着色(shading)。那么,究竟是以怎样的形式遍历一个物体,从而对其进行着色呢?选择不同的形式,着色结果有不同的效果,这一形式称为着色频率。

着色频率共有三种:对面着色(flat shading)、对顶点着色(gouraud shading)、对像素着色(phong shading)。

着色的对象不同,计算物体法线的方法也不同。虽然在常规印象中,只有面具有法线,但实际上我们也可以对顶点计算法线——只需要将顶点周围的面的法线根据一定权重插值即可。接下来,对三种着色频率进行简单的介绍:

  • 对面着色(flat shading):用面的法线进行计算,面内每个像素的颜色都一样

  • 对顶点着色(gouraud shading):用顶点的法线进行计算,根据光照模型算出每个顶点的颜色,面内每个像素的颜色根据顶点的颜色插值得到

  • 对像素着色(phong shading):用顶点的法线进行计算,先根据顶点的法线插值计算出每个像素的法线,再对每个像素用光照模型算出颜色

我们通常采用phong shading进行着色,它能产生更平滑的光照效果。在使用OpenGL编程时,选择Gouraud还是Phong只取决于把计算着色的步骤写在顶点着色器还是片元着色器中。别忘了片元着色器也叫像素着色器,渲染管线在从顶点着色器到片元着色器的过程中,完成了从顶点到像素的插值。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
games101作业3 是一项关于计算机图形图像技术的作业。 这个作业要求学生实现一个简单的三维渲染器,它能够将三维模型渲染成二维图像。 要完成这个作业,首先需要了解三维渲染的基本原理。三维渲染主要涉及光照、材质、几何变换和纹理等方面的知识。学生需要掌握顶点着色器和片段着色器的工作原理,理解如何使用着色器计算光照和阴影效果。 在实现渲染器之前,学生需要加载一个三维模型并解析它的几何信息和材质信息。模型可能是从文件中读取的,常见的格式有Obj和FBX等。学生需要编写代码将模型中的顶点、法线和纹理坐标等信息读入内存中,并构建顶点缓冲区。 接下来,学生需要编写顶点着色器和片段着色器。顶点着色器负责对顶点进行变换,并计算逐顶点的光照。片段着色器则负责在屏幕空间进行插值,并计算逐像素的光照和纹理颜色。 实现渲染器的核心部分是三维几何变换和光照计算。学生需要掌握如何进行坐标变换、投影变换和视口变换,以及如何实现光照模型,如冯氏光照模型、阴影算法等。 最后,学生需要将渲染结果输出到屏幕上。这可以通过将纹理贴图到屏幕上或直接绘制颜色缓冲区来实现。 总的来说,games101作业3 是一个涉及三维渲染技术的作业。通过实现一个简单的三维渲染器,学生可以掌握三维图形渲染的基本原理和技术。这对于理解计算机图形图像技术和深入学习三维图形学非常有帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值