opengl算法学习---光照与明暗处理

问题依据

较真实的视觉效果来自于:
明暗处理
纹理
阴影
透明性和反射.

其它增加真实感的方法

光线跟踪
一计算复杂
一容易实现,生成的图形中正确地反映阴影、镜面反射以及透明的效果
辐射度方法

光照与明暗处理

光源与材料的交互作用导致每点有不同的颜色或者明暗效果
这时需要考虑光源、材料属性、表面定向、观察者位置

模拟光照

在隐藏面消除后;为了使对象看起来更真实;应当模拟光照在物体的状态;即应当通过计算确定表示对象的像素的适当状态
在这种计算中应充分根据对象表面的状态;光源的位置以及视点的位置
需要计算每帧图像中各个像素的颜色亮度;而不是由用户直接指定

光照明暗问题分析

影响光照效果:视点、物体、光源
现实图像可看作是成像平面上的\(I(x,y,t,\lambda)\)能量分布;\((x,y)为坐标;t为时间;\lambda 为波长\)
因光的复杂性;物体外形和物理性质诱发的各类光学现象如衍射\折射等;\(I(x,y,t,\lambda)\)无法计算,因此需要进行简化

光照模型

光源照射到物体表面,会出现三种情况
一经表面反射形成反射光
一部分入射光被吸收转换成热
一若物体透明,入射光穿透物体产生透射光
物体表面的光照亮度颜色由反射光,透射光决定

简化

假定光源为点光源,景物为不透明物体
仅考虑光源直接反射光,不考虑物体间的反射

全局光照模型

考虑物体间的反射
考虑透明效果

整体光照模型

表面特征

如果对象表面光滑;对象显得明亮;如果表面粗糙;那么就显得暗淡
表面有三种类型
一镜面(specular surfaces)
一漫反射面(diffuse surfaces)
一透明面(translucent surfaces)

镜面

表面显得明亮;因为绝大多数光集中在严格镜面反射方向的周围
镜子是真正的镜面模型

漫反射面

特征是反射光向各个方向进入空间

透明面

有些光可以进入表面;从对象的另一处出来
这时也会有部分光被反射

在三维场景中的每个对象的表面可以是上述三种情形中的任一种;也可以是其中两种或三种的综合
每种情形所占的比例由对象表面的形态确定

简单光照模型

反射光I=环境光+(漫反射+镜面反射)光


理想反射

法向由局部定向确定一单位化|n| = 1
z入射角=反射角
\(\theta _{i} = \theta _{r}\)
三个向量I,n,r必须共面
一均为单位向量

漫反射

粗糙表面之所以可见;主要是来自于表面的漫反射
漫反射光强正比于入射光的竖直分量 - 即反射光强 \(\propto cos(i)\)

对于一个漫反射体,表面的反射光亮度和光源入射角(入射光线和表面法向量的夹角)的余弦成正比

镜面反射光

大多数曲面既不是理想的漫反射型曲面;也不是真正的镜面(理想反射)
光滑表面之所以显出镜面高光;是因为入射光被反射后;绝大多数集中在反射方向周围



明亮系数n

n的数值越大;物体表面越光滑。\(n \in (1,2*10^{3})\)
如果n的值介于100到200之间;那么对应于金属材料
如果n的值介于5到10之间;材料类似于塑料

环境光

实际场景中,物体会接收到从周围环境投射来的光,这种光在物体和环境之间多次反射

环境光:那些在与此环境中进行了充分的散射,无法分辫其来源与方向的光。

多种光的综合

在光照模型中;把每个光源的结果叠加在一起
每个光源具有不同的漫反射、镜面和环境光项;从而充分发挥各自最大的弹性;虽然这种处理并没有任何物理上的理由
对三原色中每种分量单独处理

光源的颜色

光源不但发射出不同量的不同频率光;而且它们的方向属性随着频率也可能不同
一真正的物理模型将非常复杂
人的视觉系统是基于三原色理论的
在大多数应用中;可以用三种成分一红、绿、蓝一的强度表示光源
一光亮度(luminance)函数为I = [Ir, Ig, Ib]

简单光照模型具体计算

\[I=I_{a}k_{a}+I_{p}(k_{d}cosi+k_{s}cos^{n} \theta) \]

\[cosi=(L_{0} \cdot N_{0}) \]

\[cos\theta = (R_{0} \cdot V_{0} ) \]

\[L_{0}、N_{0}、R_{0}、V_{0}是L, N, R, V的单位向量 \]

\[R_{0}=2cosi \cdot N_{0} - L_{0} = 2( N_{0} \cdot L_{0}) \cdot N_{0} -L_{0} \]

\(cos \theta = (R_{0} \cdot V_{0}) 由于计算不便 常用(N_{0} \cdot H_{0}) 来代替\)
\(其中H_{0}为沿L 和 V 的角平分线的单位向量\)

\[I=I_{a}k_{a}+I_{p}(k_{d}(L_{0} \cdot N_{0})+k_{s}(N_{0} \cdot H_{0})^{n} ) \]

明暗处理技术

法向计算

当给定一组光源以及视点的位置;并可以计算出法向量;那么根据前面的模型可以计算出每点的颜色
但是在每点计算法向量是相当费时的工作
绝大多数模型是用多边形网格构成的;那么法向的计算可以大大节省

多边形网格

在多边形网格中每个多边形为平面;那么存在唯一的法向量
这样存在三种明暗处理的方法
一Flat平坦处理
一Gouraud方法(插值方法)
一Phong方法

Flat明暗处理

在同一多边形上法向为常向量
视点在无穷远,视点方向V是常向量
光源在无穷远,入射方向I也是常向量
从而对于每个多边形,只需要计算其上一点的颜色,其它点的颜色与它相同

特点

同一多边形上颜色相同,每个多边形颜色不同
如果多边形网格表示的是一个光滑曲面,那么这种效果显然是不令人满意的
曲面体将失去原曲面光滑性,呈多面体状
原因:物体表面光亮度呈现不连续跃变

Gouraud明暗处理技术

在网格中每个顶点处有几个多边形交于该点;每个多边形有一个法向;取这几个法向的平均得到该点的法向
然后利用简单光照模型计算出顶点的颜色
对于多边形内的点,采用线性插值确定颜色

Gouraud双线性光强插值

特点

可克服多边形表示曲面的光亮度不连续现象,且计算量也很小
广泛用于速度要求较高的应用领域
相邻多边形的公共边界上光亮度的一阶导数并不连续->绘制画面会诱发马赫带效应
多边形内高光丢失->不能正确地模拟高光

Phong明暗处理技术

Phong方法是根据每个顶点的法向;插值出多边形内部各点的法向;然后基于光照模型计算
出各点的颜色

Phong双线性法向插值

多边形各顶点法向量计算
由顶点法向量插值计算内部各点法向量
由光照模型公式计算各点光强

插值方法:同Gouraud;双线性插值
插值对象:各像素对应法向
正确地模拟高光;明显减轻马赫带效应

由于N为矢量;故法向量插值时计算量较大;影响了它在一些实时图形系统中的应用
所花费时间通常是Gouraud方法的6到8倍
OpenGL实现的是Gouraud方法

posted @ 2020-06-13 00:45  springfield_psk  阅读(1275)  评论(0编辑  收藏  举报