山东大学计算机图形学期末复习7——CG11上
CG11上
-
着色需要考虑:
- 光源(Light sources)
- 材质属性(Material properties)
- 观察者位置(Location of viewer)
- 表面方向(Surface orientation)
-
散射:光与物体表面交互后,向各个方向重新分布。散射类型包括:
- 漫反射:光线均匀散射,产生柔和的亮度变化(如粗糙表面)。
- 镜面反射:光线沿特定方向反射,产生高光(如光滑表面)。
-
在特定着色点计算朝向相机的反射光,需要以下输入:
- 观察者方向 (v):从着色点指向相机的向量,决定高光可见性。
- 表面法向量 (n):垂直于表面的向量,决定光线入射角和反射方向。
- 光源方向 (l):从着色点指向光源的向量,影响漫反射和镜面反射。
- 表面参数:包括颜色(决定反射光的颜色分量)、光泽度(决定高光强度和分布)。
-
点光源 (Point Light Source)
点光源是计算机图形学中常用的光源模型之一。它被假定为一个理想的点,它的光线可以均匀地向所有方向发射。以下是点光源的关键特性和相关概念:
点光源的模型
- 位置与颜色:
- 位置:点光源的位置在三维空间中是固定的,通常表示为 p 0 = ( x 0 , y 0 , z 0 ) p_0 = (x_0, y_0, z_0) p0=(x0,y0,z0)。
- 颜色:点光源的颜色由光源的红、绿、蓝分量(RGB)来表示,决定了该光源所发出的光的色彩特性。
- 远距离光源:
- 在某些情况下,远距离的光源可以视为平行光源,尤其是当光源位于无限远处时,光线的方向被认为是平行的,光强度不会随距离变化。
光强的计算公式
光强表示光源在空间中某个点 p = ( x , y , z ) p = (x, y, z) p=(x,y,z) 产生的光的强度,公式如下:
i ( p , p 0 ) = I ( p 0 ) ∣ p − p 0 ∣ i(p, p_0) = \frac{I(p_0)}{|p - p_0|} i(p,p0)=∣p−p0∣I(p0)- i ( p , p 0 ) i(p, p_0) i(p,p0) 是点 p p p 处的光强。
- p 0 p_0 p0 是点光源的位置。
- I ( p 0 ) I(p_0) I(p0) 是点光源的光强。
- ∣ p − p 0 ∣ |p - p_0| ∣p−p0∣ 是点 p p p 和光源 p 0 p_0 p0 之间的距离。
物理意义:该公式表明光强与距离的平方成反比,距离越远,光强越弱。
应用场景
- 计算机图形学:点光源通常用于模拟现实世界中的灯泡、蜡烛等光源,为场景提供基础照明。
- 光照模型:点光源是构建光照模型的基本元素之一,可用于实现不同的光照效果,如漫反射、镜面反射等。
注意事项
- 理想化模型:点光源模型是一种理想化的模型,实际上,光源往往有一定的体积和形状。然而,点光源在许多情况下能提供足够精确的近似效果。
- 光强衰减:公式中的光强衰减模型是简化的,实际上光强的衰减还受到其他因素的影响,如介质散射和吸收等。
- 位置与颜色:
-
Phong 模型
Phong 模型是一种常用的光照模型,用于计算三维物体表面的光照效果。它模拟了物体表面受到光照时的漫反射、镜面反射和环境光三种反射现象。Phong 模型简单且计算速度较快,通常用于实时渲染。
组成部分
Phong 模型有三个主要的反射成分:
- 漫反射 (Diffuse Reflection):光线被粗糙表面均匀反射,反射光强与入射光的方向和表面法线之间的夹角有关。
- 镜面反射 (Specular Reflection):光线在光滑表面上反射,反射强度与视角方向和反射方向之间的夹角有关,产生高光效果。
- 环境光 (Ambient Light):模拟环境中所有光源的光照效应,通常是均匀的光照。
使用的四个向量
- 光源方向:从物体表面到光源的方向。
- 观察者方向:从物体表面到观察者(摄像机)的方向。
- 法向量:物体表面的法线,用于确定表面的方向。
- 完美反射方向:镜面反射的理想方向。
-
环境光 (Ambient Light)
环境光是由于大范围光源与物体的多次交互产生的效果。它通常表示场景中到处都有的均匀光照。环境光的颜色和强度取决于光源的颜色和物体的材质特性。
环境光的计算公式:
I a = k a ⋅ I a I_a = k_a \cdot I_{a} Ia=ka⋅Ia
- I a I_a Ia 是环境光强度。
- k a k_a ka 是物体材质的环境光反射系数。
- I a I_a Ia 是环境光的光强。
特性
- 环境光是均匀的,不依赖于观察角度和光照角度。
- 它可以对场景中的所有物体提供基础照明。
-
环境光是均匀的,不依赖于观察角度和光照角度。
-
它可以对场景中的所有物体提供基础照明。
漫反射 (Diffuse Reflection)
漫反射是指光照在不规则表面上反射,导致光线在所有方向上均匀散射。理想的漫反射表面非常粗糙,使得入射的光线均匀地从所有方向反射。
朗伯面 (Lambertian Surface)
在朗伯面上,反射的光强与入射光与表面法线的夹角 θ \theta θ 成正比。根据 朗伯余弦定律 (Lambert’s Cosine Law),反射光强 I d I_d Id 可以用下式计算:
I d = k d ⋅ I ⋅ cos θ I_d = k_d \cdot I \cdot \cos \theta Id=kd⋅I⋅cosθ
- I d I_d Id 是漫反射的光强。
- k d k_d kd 是漫反射反射系数,通常是RGB分量。
- I I I 是入射光的强度。
- cos θ \cos \theta cosθ 是入射光与法线之间的夹角的余弦值,决定了反射光的强度。
物理意义
- 朗伯表面:在这种表面上,反射光强度与入射角度相关,入射角度越小(与法线越接近),反射光强度越大。
- 光线反射:入射的光线在表面上均匀反射,因此反射光的强度与表面的粗糙度有关。
理想反射体(Ideal Reflector)
定义
理想反射体是指那些能够完美反射入射光线的表面,反射光线的方向完全符合反射定律,即反射角等于入射角。
反射角和入射角
- 法线方向:反射角和入射角都相对于表面的法线来定义。
- 反射定律:在理想反射中,入射光线与表面法线的夹角等于反射光线与表面法线的夹角。
- 共面性:入射光线、反射光线和法线必须位于同一平面内。
理想反射公式
理想反射的反射光线 r \mathbf{r} r 计算公式为:
r = 2 ( l ⋅ n ) n − l \mathbf{r} = 2 (\mathbf{l} \cdot \mathbf{n}) \mathbf{n} - \mathbf{l} r=2(l⋅n)n−l
- r \mathbf{r} r 是反射光线。
- l \mathbf{l} l 是入射光线。
- n \mathbf{n} n 是表面的法向量。
- l ⋅ n \mathbf{l} \cdot \mathbf{n} l⋅n 是入射光线与法线之间的点积。
此公式表示了反射光线 r \mathbf{r} r 的方向,它是入射光线 l \mathbf{l} l 关于法线 n \mathbf{n} n 的对称反射。
光泽度系数(Shininess Coefficient)
介绍
光泽度系数 α \alpha α 控制镜面反射高光的锐利程度。较小的 α \alpha α 值会产生较大的、高光不那么锐利的反射,而较大的 α \alpha α 值则会产生更小且更锐利的高光。这个系数对物体表面的光滑度和反射特性有着显著影响。
不同材质的光泽度系数
- 金属:对于金属表面,光泽度系数通常较大(在 100 到 200 之间),因此它们通常会呈现出非常锐利的镜面反射高光。
- 塑料:对于塑料表面,光泽度系数较小,通常在 5 到 10 之间,这使得它们的高光较为模糊,呈现较为柔和的反射效果。
光源衰减 (Light Source Attenuation)
1. 光照模型:
光照模型描述了计算光源与表面之间光照强度的公式,其中包含环境光、漫反射光和镜面反射光三大组件。
-
公式:
I = I a ⋅ k a + f a t t ⋅ I l i g h t ⋅ k d ⋅ ( N ⋅ L ) I = I_a \cdot k_a + f_{att} \cdot I_{light} \cdot k_d \cdot (N \cdot L) I=Ia⋅ka+fatt⋅Ilight⋅kd⋅(N⋅L)- I a I_a Ia:环境光强度。
- k a k_a ka:材质的环境反射系数。
- f a t t f_{att} fatt:光源衰减因子。
- I l i g h t I_{light} Ilight:光源的强度。
- k d k_d kd:材质的漫反射系数。
- ( N ⋅ L ) (N \cdot L) (N⋅L):法线向量 N N N 与光源方向向量 L L L 的点积,表示入射光的强度与表面法线的夹角。
2. 衰减因子的计算:
-
简单的平方反比衰减:
f a t t = 1 d L 2 f_{att} = \frac{1}{d_L^2} fatt=dL21- d L d_L dL:光源与表面之间的距离。
- 该模型假设光的衰减与距离的平方成反比,模拟了实际光源随距离远离的光强衰减。
-
带有常数、线性及二次项的衰减:
f a t t = min ( c 1 + c 2 ⋅ d L + c 3 ⋅ d L 2 , 1 ) f_{att} = \min(c_1 + c_2 \cdot d_L + c_3 \cdot d_L^2, 1) fatt=min(c1+c2⋅dL+c3⋅dL2,1)- c 1 , c 2 , c 3 c_1, c_2, c_3 c1,c2,c3:衰减常数。
- 这个衰减公式更细致地控制衰减过程,引入了常数项、线性项和二次项,以适应不同光源和材质的需求。
Phong模型中的光源
1. 光照成分:
Phong模型将光照分解为三种成分:
- 漫反射(Diffuse Reflection):表面与入射光的角度决定反射光强度。
- 镜面反射(Specular Reflection):表面对入射光的高光反射,取决于视角与反射方向的夹角。
- 环境光(Ambient Light):全局的均匀背景光。
每个光源对每个成分都有独立的贡献,这三种成分会被加总得到最终的光照强度。
2. 每个光源的贡献:
每个光源的贡献包括三个分量:漫反射、镜面反射和环境光,每个分量都有RGB分量,因此每个光源共有9个系数(每个成分3个RGB分量)。
- 漫反射: I d r , I d g , I d b I_{dr}, I_{dg}, I_{db} Idr,Idg,Idb
- 镜面反射: I s r , I s g , I s b I_{sr}, I_{sg}, I_{sb} Isr,Isg,Isb
- 环境光: I a r , I a g , I a b I_{ar}, I_{ag}, I_{ab} Iar,Iag,Iab
材质属性
1. 材质反射属性:
- 漫反射系数: k d r , k d g , k d b k_{dr}, k_{dg}, k_{db} kdr,kdg,kdb,表示材质对不同颜色光的漫反射能力。
- 镜面反射系数: k s r , k s g , k s b k_{sr}, k_{sg}, k_{sb} ksr,ksg,ksb,表示材质对不同颜色光的镜面反射能力。
- 环境光系数: k a r , k a g , k a b k_{ar}, k_{ag}, k_{ab} kar,kag,kab,表示材质对环境光的反射能力。
2. 光泽度系数:
- 光泽度系数 α \alpha α:控制镜面反射高光的集中程度。值越大,高光越集中且锐利,通常对应于如金属等表面;值越小,高光越模糊,通常对应于塑料等表面。
Phong模型公式
1. 完整公式:
Phong模型中,光源的贡献为漫反射、镜面反射和环境光的加权和。公式如下:
I = k d I d ( N ⋅ L ) + k s I s ( V ⋅ R ) α + k a I a I = k_d I_d (N \cdot L) + k_s I_s (V \cdot R)^\alpha + k_a I_a I=kdId(N⋅L)+ksIs(V⋅R)α+kaIa
- I I I:最终的光强。
- k d k_d kd、 k s k_s ks、 k a k_a ka:材质的漫反射、镜面反射和环境光系数。
- I d I_d Id、 I s I_s Is、 I a I_a Ia:光源的漫反射、镜面反射和环境光强度。
- N N N:表面的法向量。
- L L L:光源方向向量。
- V V V:观察者方向向量。
- R R R:反射方向向量。
- α \alpha α:光泽度系数。
2. 各项含义:
- 漫反射项: k d I d ( N ⋅ L ) k_d I_d (N \cdot L) kdId(N⋅L),表示光线与法线夹角的余弦值,模拟均匀散射的效果。
- 镜面反射项: k s I s ( V ⋅ R ) α k_s I_s (V \cdot R)^\alpha ksIs(V⋅R)α,表示观察方向与反射方向的接近程度,模拟高光反射的效果。
- 环境光项: k a I a k_a I_a kaIa,表示均匀的背景光源。
3. 多光源情况:
对于场景中的每个光源,我们都计算上述公式,并累加得到最终的光照效果。
Phong光照模型(简写)
1. 简化公式:
在简化版本的Phong模型中,公式表示为:
I = k a I a + k d I d cos θ + k s I s cos n γ I = k_a I_a + k_d I_d \cos \theta + k_s I_s \cos^n \gamma I=kaIa+kdIdcosθ+ksIscosnγ
- cos θ \cos \theta cosθ:入射光线与法线的夹角,表示漫反射强度。
- cos γ \cos \gamma cosγ:观察方向与反射方向的夹角,表示镜面反射强度。
- n n n:光泽度系数 α \alpha α,控制镜面反射高光的锐利程度。
2. 解释:
- 漫反射:与入射角度 θ \theta θ 相关,越接近法线的入射角产生的反射越强。
- 镜面反射:与观察角度 γ \gamma γ 相关,越接近理想反射的观察角度产生的高光越强。
- 环境光:常量部分,补充整体亮度。
Modified Phong Model (Blinn-Phong Model)
1. 背景与问题:
- Phong模型的镜面反射计算问题:
- 在Phong模型中,镜面反射项的计算涉及两个重要操作:
- 计算反射向量 r \mathbf{r} r。
- 计算 v ⋅ r \mathbf{v} \cdot \mathbf{r} v⋅r(观察向量与反射向量的点积)。
- 反射向量计算:反射向量 r \mathbf{r} r 是基于光源方向 l \mathbf{l} l 和法线方向 n \mathbf{n} n 的。计算过程涉及到向量的反射,通常较为复杂且计算量大。
- 计算复杂性:对于每个顶点和光源方向,反射向量 r \mathbf{r} r 需要进行计算,而反射光强则通过计算 v ⋅ r \mathbf{v} \cdot \mathbf{r} v⋅r 来完成,这使得实时渲染中计算成本较高。
- 在Phong模型中,镜面反射项的计算涉及两个重要操作:
2. Blinn-Phong模型:
通过比对法向量n和半程向量h的接近程度,来界定视角向量和反射向量的接近程度。因为视角向量和反射光向量越接近,则该半程向量和法向量越接近(法向量实则是入射光向量和反射光向量的半程向量)
-
Blinn的优化思路:为了解决Phong模型中反射向量和计算的复杂性,Blinn提出了一种新的简化方法,引入了一个叫做半程向量 h \mathbf{h} h(halfway vector)来代替反射向量 r \mathbf{r} r。
-
半程向量 h \mathbf{h} h 是光源方向 l \mathbf{l} l 和观察方向 v \mathbf{v} v 的归一化平均向量:
h = l + v ∥ l + v ∥ \mathbf{h} = \frac{\mathbf{l} + \mathbf{v}}{\|\mathbf{l} + \mathbf{v}\|} h=∥l+v∥l+v -
通过计算 n ⋅ h \mathbf{n} \cdot \mathbf{h} n⋅h 来代替 v ⋅ r \mathbf{v} \cdot \mathbf{r} v⋅r,简化了计算。
-
3. 计算反射向量与半程向量:
-
反射向量计算:
-
反射向量 r \mathbf{r} r 可以通过光源方向 l \mathbf{l} l 和法线向量 n \mathbf{n} n 来计算。根据反射定律,反射向量是入射光线 l \mathbf{l} l 关于法线 n \mathbf{n} n 的镜面反射方向,公式为:
r = 2 ( n ⋅ l ) n − l \mathbf{r} = 2 (\mathbf{n} \cdot \mathbf{l}) \mathbf{n} - \mathbf{l} r=2(n⋅l)n−l -
该公式涉及到入射光线和法线的点积计算,较为复杂。
-
-
半程向量计算:
-
半程向量 h \mathbf{h} h 是光源方向 l \mathbf{l} l 和观察方向 v \mathbf{v} v 的加权平均值,公式为:
h = l + v ∥ l + v ∥ \mathbf{h} = \frac{\mathbf{l} + \mathbf{v}}{\|\mathbf{l} + \mathbf{v}\|} h=∥l+v∥l+v -
半程向量用于近似代替反射向量进行镜面反射的计算。通过计算法线 n \mathbf{n} n 与半程向量 h \mathbf{h} h 的点积 n ⋅ h \mathbf{n} \cdot \mathbf{h} n⋅h,比直接计算 v ⋅ r \mathbf{v} \cdot \mathbf{r} v⋅r 更加高效。
-
4. 使用半程角度:
-
代替反射角计算:
-
在Blinn-Phong模型中,镜面反射项被修改为:
k s I s ( n ⋅ h ) β k_s I_s (\mathbf{n} \cdot \mathbf{h})^\beta ksIs(n⋅h)β -
β \beta β 控制高光的锐利程度,与Phong模型中的光泽度系数 α \alpha α 类似,越大则高光越锐利。
-
半程角度 θ h \theta_h θh 是 r \mathbf{r} r 与 v \mathbf{v} v 之间的夹角的一半(若两向量共面)。通过使用半程向量 h \mathbf{h} h,我们能够计算出一个比直接使用反射向量更简便的光照模型。
-
5. Blinn-Phong模型与OpenGL标准:
- Blinn-Phong的优势:
- 由于计算反射向量 r \mathbf{r} r 需要较高的计算成本,而半程向量的计算相对简单,因此Blinn-Phong模型具有更高的效率。
- 对于实时渲染应用,Blinn-Phong模型常用于代替传统的Phong模型,尤其是在需要处理多个光源时,Blinn-Phong能够显著减少计算量,同时保持较好的视觉效果。
- OpenGL标准:
- 由于Blinn-Phong模型提供了更好的计算效率和视觉效果,它已成为OpenGL中标准的光照模型,广泛应用于实时渲染中。
法向量计算
平面法向量计算:
n = ( p 2 − p 0 ) × ( p 1 − p 0 ) \mathbf{n} = (\mathbf{p}_2 - \mathbf{p}_0) \times (\mathbf{p}_1 - \mathbf{p}_0) n=(p2−p0)×(p1−p0)
球面法向量:
隐式函数: f ( x , y , z ) = x 2 + y 2 + z 2 − 1 = 0 f(x, y, z) = x^2 + y^2 + z^2 - 1 = 0 f(x,y,z)=x2+y2+z2−1=0
法向量: n = [ ∂ f ∂ x , ∂ f ∂ y , ∂ f ∂ z ] T = p \mathbf{n} = \left[ \frac{\partial f}{\partial x}, \frac{\partial f}{\partial y}, \frac{\partial f}{\partial z} \right]^T = \mathbf{p} n=[∂x∂f,∂y∂f,∂z∂f]T=p
参数化曲面法向量:
x = cos u sin v , y = cos u cos v , z = sin u x = \cos u \sin v, \quad y = \cos u \cos v, \quad z = \sin u x=cosusinv,y=cosucosv,z=sinu
切向量:
∂ p ∂ u = [ ∂ x ∂ u , ∂ y ∂ u , ∂ z ∂ u ] T , ∂ p ∂ v = [ ∂ x ∂ v , ∂ y ∂ v , ∂ z ∂ v ] T \frac{\partial \mathbf{p}}{\partial u} = \left[ \frac{\partial x}{\partial u}, \frac{\partial y}{\partial u}, \frac{\partial z}{\partial u} \right]^T, \quad \frac{\partial \mathbf{p}}{\partial v} = \left[ \frac{\partial x}{\partial v}, \frac{\partial y}{\partial v}, \frac{\partial z}{\partial v} \right]^T ∂u∂p=[∂u∂x,∂u∂y,∂u∂z]T,∂v∂p=[∂v∂x,∂v∂y,∂v∂z]T
法向量:
n = ∂ p ∂ u × ∂ p ∂ v \mathbf{n} = \frac{\partial \mathbf{p}}{\partial u} \times \frac{\partial \mathbf{p}}{\partial v} n=∂u∂p×∂v∂p
平坦着色(Flat Shading)
glShadeModel(GL_FLAT)
平坦着色是一种简单的光照模型,用于为3D模型提供基本的光照效果。以下是关于平坦着色的详细解释:
基本原理
- 面片统一颜色:在平坦着色中,每个面片(通常是三角形或多边形)使用一个统一的颜色进行渲染。这个颜色是根据面片的法线和光源的位置计算得出的。
- 光照计算:光照计算在每个面片的基础上进行,而不是在顶点或片元的基础上。计算时,使用面片的法线向量和光源的方向来确定光照强度。
计算过程
- 面片法线:每个面片有一个法线向量,这个法线向量用于确定光照反射的方向。面片法线通常是通过计算面片顶点坐标的叉积得到的。
- 光照模型:使用简单的光照模型(如Lambertian漫反射模型)计算光照强度。光照强度取决于面片法线和光源方向之间的夹角。