摄像机、光照与材质
从观察空间进入基础光照模型和材质参数。
摄像机
📌 提示
所谓摄像机,不过一个矩阵而已,所有的变换,不过都是变换这个矩阵,根本没有相机
观察空间
讨论摄像机/观察空间(Camera/View Space)的时候,是在讨论以摄像机的视角作为场景原点时场景中所有的顶点坐标:观察矩阵把所有的世界坐标变换为相对于摄像机位置与方向的观察坐标
- 观察矩阵 把世界坐标变换成相对于摄像机位置与方向的观察坐标
view Matrix

相机矩阵推导:
前提条件:
- 相机的位置 (0,0,3)
- 相机的方向 (0,0,0)
- 一个世界坐标的向上方向 (0,1,0)
- 移动 改变观察矩阵来实现
鼠标的移动输入由鼠标的前后变化位置计算各个向量分量,最后应用于观察矩阵的变化
lookAt矩阵

💡 提示
在计算机图形学中,"lookAt"矩阵和"view"矩阵都用于定义摄像机的位置和方向,但它们在实现方式上有所不同。
lookAt矩阵:这个矩阵用于将世界坐标系中的点转换到摄像机坐标系中。它通常由三个参数来定义:摄像机的位置(eye),目标点(look-at point),以及一个向上向量(up vector)。lookAt矩阵可以通过以下步骤来计算:
- 首先计算从摄像机位置到目标点的Z轴(forward vector)。
- 然后计算X轴,通常使用向上向量和Z轴的叉乘来得到。
- 接着计算Y轴,使用Z轴和X轴的叉乘。
- 最后,将这些向量归一化,并构造出一个旋转矩阵。
- 将摄像机平移至目标点的相反方向,以完成lookAt矩阵。
view矩阵:也称为摄像机矩阵或观察矩阵,它通常是指将世界坐标系中的点转换到摄像机坐标系中的矩阵。在某些上下文中,"view"矩阵可能与"lookAt"矩阵相同,但在其他情况下,"view"矩阵可能包括更广泛的摄像机设置,如视野(field of view)、纵横比(aspect ratio)和近远裁剪平面(near and far clipping planes)。 总的来说,lookAt矩阵是创建view矩阵的一种特定方法,它专注于摄像机的位置和朝向。在某些实现中,这两个术语可能会互换使用,但在更严格的计算机图形学定义中,view矩阵可能包含lookAt矩阵以外的其他摄像机参数。 来自kimi
📌 提示
你所认识的世界,都是对世界的抽象,有时候很难分清抽象与事物本身的关系
- 查看threejs中源码的viewMatrix和projectionMatrix是如何计算的
光照
颜色
定义
⚽ 提示
物体的颜色是由物体反射出来的光决定的,也就是物体不吸收的部分颜色,才是物体的颜色,或者说被认为是物体的颜色
可以使用光照颜色和物体对颜色的吸收特性,来模拟物体的颜色特性
图形学中,物体颜色的定义:物体从一个光源反射各个颜色分量的大小。也就是这个反射分量,就代表了物体的颜色的意义,表示如果光源是白光的话,物体看起来的颜色;其它颜色的光源,则表现不相同
光照
所谓的亮和暗,都是通过物体显示的颜色变化来表现的,所谓的光,不过是一个显示颜色的数值比例,根本没有光
总结: 不同的物体在不同的光下有不同的颜色表现(正确的废话)
含义如下:
- 为了实现不同的光的模拟,使用冯氏光照模型来近似描述光 -> 光照的三个分量,既可以认为是颜色值,也可以认为是对白色光的反射率
- 为了模拟不同物体对光的反应,同样需要对物体的材质使用冯氏模型来进行细粒度的描述 -> 光照贴图
- 通过在片元着色器中,光的三个分量与物体的三个分量分别计算后叠加,得到最终的颜色
- 光照模型就是在光源和物体两个方面都细粒度描述光照的效果
现实世界的光照是极其复杂的,计算机图形只能使用一些简化的模型来近似模拟,其中冯氏光照模型最常用
冯氏光照模型包含三个分量:
- 环境光照 Ambient Light 各个方向的微弱光线,通常来自不同的物体,设置一个常量模拟
- 漫反射光照 Diffuse Lighting 冯氏光照视觉上最显著分量 模拟光照对物体方向性影响
- 镜面光照 Specular Lighting 有光泽物体上的亮点,镜面光照的颜色相比物体颜色更倾向于光线颜色
漫反射和镜面反射的一个重要的区别在于,漫反射和观察角度无关,而镜面反射和观察角度相关,要计算物体是否在光线照射的半径内
冯氏光照模型光照分类
❗ 提示
在世界空间中计算光照的原因:光源是需要在世界空间中才好去计算光照的方向,同时面的法向量也要转换到世界矩阵中,计算出的结果可以传递给片元着色器去计算最终的颜色,更常见的是在观察空间中计算, 在哪个空间中计算都不影响结果
环境光照
真正去实现模拟环境光源开销巨大且价值不大,所以不使用这个方式,而是使用光的颜色乘以一个很小的环境因子再乘以物体的颜色来模拟
这样只需要在片元着色器中进行一次计算,即可达到效果,性能好!
片元着色器的数量比顶点着色器多得多!!
漫反射光照

光照的计算过程
需要的条件: 光线的方向、法向量
漫反射一般为固定方向的光线对物体的影响,所以光线与面的相交角度对亮度的影响很大,可以通过法向量得到
- 定义一个光源位置,方便后面和顶点一起计算出光线方向,定义光源颜色
- 将顶点转换成世界坐标,并计算顶点所在的面的法向量(亦即在世界空间中去计算漫反射,为啥?)
- 和光源一起计算光线向量,从而计算漫反射分量,(注意负数颜色无意义,最小取0),注意标准化,使用单位向量
- 计算漫反射值和其他光照的值,乘以物体颜色
- 漫反射分量与物体颜色相乘得到最终颜色
镜面光照
镜面光照计算需要一个额外的观察向量,不同的角度观察,镜面反射的光照强度不同
原理是计算反射角与观察向量的夹角来分配不同的光照强度

反光度(Shininess): 反光度越高,反射光的能力越强,散射得越少,高光点就会越小
🎹 提示
在光照着色器的早期,开发者曾经在顶点着色器中实现冯氏光照模型。在顶点着色器中做光照的优势是,相比片段来说,顶点要少得多,因此会更高效,所以(开销大的)光照计算频率会更低。然而,顶点着色器中的最终颜色值是仅仅只是那个顶点的颜色值,片段的颜色值是由插值光照颜色所得来的。结果就是这种光照看起来不会非常真实,除非使用了大量顶点
一般情况下,顶点着色器中的计算次数比片段着色器中少得多(至少至少相等),因为片段着色器是由顶点着色器扩充而来的,包含了所有的像素,而顶点只包含了顶点而已
法线向量
垂直于片元表面的向量
法线矩阵
为了消除不等比缩放等操作对法线的影响(导致法线向量不再垂直于片元表面)的特殊矩阵,作用于法线向量相同
具体的矩阵推导看原文

材质
概念
我理解的材质是什么?
材质就是物体的反光属性,对环境光、漫反射、镜面反射的各种颜色反射的程度,在冯氏光照模型中就是rgb的分量
设置物体的材质以及光照的颜色
在opengl中的材质包括 环境光(ambient)、漫反射(diffuse)、镜面反射(specular) 反光度(Shininess)
由于环境光、漫反射、镜面反射的强度不同,所以需要在光源中去定义各个反射的强度
光照贴图 本质上就是纹理, 也就是说,这个计算本质上就是在贴图颜色的基础上混合光的颜色
- 漫反射贴图 本质上就是纹理图片的颜色,也就是说,这个计算本质上就是在贴图颜色的基础上混合光的颜色
- 镜面反射贴图 原理和上面相同,只是贴图像素信息只表示镜面光的强度
投光物
定向光
距离很远的光源,可以认为是平行光,所有的方向都一致,无需计算衰减,所以物体与光源的相对位置是不重要的
点光源(point light)
- 有位置,需要计算光的方向
- 有衰减 ,按距离衰减 线性或者非线性
- 朝所有方向照射
聚光(spot light)
- 有照射范围,需要根据切光角计算范围
- 有位置,需要计算光的方向
- 有衰减
- 只照射特定方向
衰减(Attenuation) 随着光线传播距离的增长逐渐削减光的强度通常叫做衰减,一般不是线性衰减,而是一个二项式

聚光的计算,光源的位置,角度计算出片元是否在聚光内,在则计算片元的颜色与光颜色的混合,得到片元的颜色,不在则给一点环境光
但是这样会导致一个边缘过度过于生硬的问题,所以解决方案一般是定义一个内圆和外圆,形成过渡效果,内圆强度是1,内圆到外圆之间强度为1-0,外圆之外同理
光线追踪
光照的到物体后反射光没有消失,仍然可以作为一个新的光源,去影响其他物体