Transcript 环境光和漫反射
课程内容进展
综述
‘图形学’和‘图形系统’
建模
曲线曲面 实体造型
观察
观察流水线 裁剪
显示
可见面判别
其它
UI 动画 ……
光照 面绘制
坐标系统
基本图元
几何变换
第九讲
光照模型与面绘制算法
基本概念
光照模型 Illumination Model
计算表面上点的光强度的模型(方法)
表面绘制算法 Surface Rendering
对场景中所有表面的投影位置的象素点,根据光照模
型计算光强度的过程
真实感成像(前提首先是建立几何模型、透视投影、消除隐藏面)
表面特性的精确表示
场景中光照效果的物理描述:反射、透明度、纹理、阴影
光的度量
光源一般会向不同方向以不同强度发出光通量——
光通量:光能,单位时间传递的辐射能总量
单位:瓦特(焦耳/秒) 或者 流明 lm
要获得场景中表面上的光照效果——
辐射度B :单位面积上离开表面的光通量。
单位:瓦特/米2
光强度:特定方向上单位立体角放出的光辐射度
单位:cd(坎德拉) 或者 瓦特/(米2·球面度)
光源
光的颜色
光的来源
白色光
彩色光
单色光
等能量的各种波长可见光的组合
发光光源
反射光源
点光源
发光特性
方向光源
扩展光源
无穷远光源
光源(续)
背景光
(环境光)
影响物体的方式
镜面反射
反射光
漫反射
点光源发射光
漫反射
背景光+反射光
镜面反射
本章主要内容
一、基本光照模型
二、RGB颜色
三、基本透明模型
四、雾气
五、阴影
六、光强度显示
七、半色调处理
八、表面绘制(明暗)
九、光线跟踪
十、辐射度光照模型
纹理映射
OpenGL实现光照和表
面绘制
一、基本光照模型
各表面为理想漫反射体:假设入射光在各个方向
以相同强度发散而与观察位置无关
环境光引起的全局漫反射
点光源引起的漫反射
点光源引起的镜面反射
多个点光源引起的反射
表面光发射
辐射强度衰减
角强度衰减
环境光
特点
场景的一般亮度
对所有表面的统一照明
反射强度依赖于表面材质属性
环境光全局漫反射计算
Iambdiff=KdIa 0 Kd 1
每个表面设定漫反射系数Kd
环境光强度Ia
点光源漫反射
特点:
光线照射到物体表面后,向各个方向均匀发出
点光源漫反射计算
IL,diff=KdILcos=KdIL(N.L)
IL
Kd
光源强度
表面的漫反射系数
入射光与表面法线夹角
L
N
(1)环境光+点光源
Idiff=
KaIa+ KdIL(N.L)
KaIa
N.L>0
N.L0
Ka 环境光漫反射系数(为每一表面指定,用来
调节环境光的最终光照效果)
Kd 表面漫反射系数
Ia 环境光强度
IL 点光源L的光强度
ka与kd值介于0到1.0之间的球面在暗灰色环境
光与一个白色点光源照射下产生的漫反射
点光源镜面反射
注意:L,N,R,V
均为单位向量
特点
镜面反射角=入射角
在镜面反射角的一个会聚区域内入射光的全部或大部分成为反射光
光亮表面,大ns
黯淡表面,小ns
Phong镜面反射模型
ns:镜面反射参数
Ks:恒定的镜面反射系数(本来应该和材质、透明度、入射光角度、颜
色等有关)
Ks
ns
对于不同的镜面参数值计算单个点光源
场景中球面的镜面反射效果
注意:L,N,R,V
均为单位向量
H:L和V间的半角向量
给定的光源和视点,H是观察方
向上产生最大镜面反射(最大亮
度)的表面朝向
简化的Phong模型: 用NH替代 VR
对于非平面,
具有更高效率
(2)phong照明模型 (与漫反射合并)
环境光,单个点光源的漫反射+镜面反射
Ka
环境光漫反射系数
Kd 表面漫反射系数
Ia 环境光强度
IL 光源L的强度
环境光,多个点光源的漫反射+镜面反射
Ks 镜面反射系数
ns 镜面反射参数
N 表面法线单位矢量
L 指向光源方向单位矢量
H 理想镜面反射方向单位矢
量
(a)
(b) (c)
场景的线框图;
(d)
单个点光源,(ks=0)环境光和漫反射;
环境光,不同表面颜色
单点光源,环境光、漫反射和镜面反射
表面光发射
例子:吸顶灯,招牌
点光源+光锥
用扩展光源逼近:点光源网格
更强的真实感:辐射度模型
简单的计算:加入发射项Isurfemission
(3)考虑表面发射项和强度衰减
点光源
无穷远光源
辐射强度衰减
点光源与表面距离为dl
方向光源
角强度衰减
Vobj
光源不是方向光源
Vlight
对象位于投射圆锥外
其它
al :衰减指数
O
对象后面的光源
其它
对象后面的光源
其它
光照模型
(光强的计算)
颜色
透明度
其它效果
强度等级的划分
强度的显示
二、RGB颜色
为Ka,Kd,Ks各自定义RGB分量,例如
以蓝色为例,点光源漫反射计算修改为:
漫反射和镜面反射颜色向量(K为单值常数)
漫反射颜色向量
镜面反射颜色向量
以蓝色为例,点光源漫反射计算修改为:
三、基本透明模型
折射
入射材料折射率
Snell定律
折射材料折射率
简化的透明模型计算方法
I=(1-Kt)Iref1+KtItrans
Kt 透明系数,Iref1反射强度,Itrans 透射强度
深度排序、深度缓存算法、A缓存算法
四、雾气
fatmo(d):雾气衰减函数
Iobj:对象表面光强度
Iatmo:模拟雾气光强度(也可同时考虑颜色)
d:观察位置到对象的距离
ρ:雾气的正密度
ρ越大,雾气越稠
密,表面越柔和
五、阴影
视点置于光源位置,不可见的表面即为阴影
计算出来的阴影可以当作表面图案存储
六、光强度显示
(0.0-1.0)系统分配的有限强度等级
人对声音、光强的感觉按对数等级变化
均匀的强度等级:相邻强度之比相同
Gamma校正
显示设备亮度变化非线性,
象素光强值线性变化
视频查找表调整线性象素值
参数
和
取决于显示设备属性
V为电子枪电压,I为显示强度
现状:
问题:
电压=0.5 时,强度=0.2
。。。。。。
电压=0.8 时,强度=0.5
所需像素强度=0.5,应该使用多大电压?
电压=1
所需像素强度=1,应该使用多大电压?
时,强度=1
规
范
化
的
电
子
枪
电
压
强
度
规范化的电子枪电压
强度
2个强度等级
4个强度等级
连续色调图象
至少32个强度等级
8个强度等级
七、半色调处理(halftoning)
基本思想:显示设备提供的光强等级数目较少时,将
多个象素单元组合起来表示一种强度值。
2级系统
2x2象素网格
5种强度等级
2级系统
3x3象素网格
10种强度等级
报纸、书刊上的
半色调照片,用
不同尺寸的黑点
(白点)表示色
调
光照模型
(光强的计算)
应用在
表面绘制
(每个点的光强计算)
应用在
全局光照效果
光线跟踪方法
辐射度方法
八、多边形(表面)绘制算法
恒定强度表面绘制(平面绘制)
一个多边形对应一个光强度
适合于情况:
多面体
光源足够远 N.L 及衰减函数为常数
视点也足够远 V.R 为常数
Gouraud明暗处理
Phong明暗处理
Gouraud明暗处理: 强度插值
由共享顶点的面的法向量平均值求顶点法向量
计算顶点光强度
多边形表面上将强度线性插值
缺点:高光处理不好,会有马赫带效应(多边形交界处,
光强的一阶导数不连续,从而得到过亮或过暗条纹)
Phong明暗处理:法向量插值
求顶点法向量
法向量在表面上插值
每点计算强度
更精确
但是计算量大
九、光线跟踪方法(ray tracing)
正向效果:光源(环境光)发出无数光线,
在可以直接到达的表面上产生反射、折射;
反/折射光进一步到达其它表面……直到部
分光线最终到达投影平面上的像素位置。
逆向模拟
以像素为起点
像空间
光线跟踪流程
跟踪象素光线:对每一象素,反向跟踪由它到场景的光线
(Pprp到像素中心连线),求出与第一个物体的交点。
从交点出发再反向跟踪从属光线:反射和折射。
满足以下条件之一时,停止跟踪:
该光线不和任一表面相交
该光线与一个光源相交且该
光源不是反射面
该树达到最大深度(存储极限)
跟踪结果:
生成二叉光线跟踪树
投影
参考
点
Pprp
投影平面上的
象素网格
二叉光线跟踪树
(1)求交计算
(2)光照效果计算
(2A)像素光强
(2B)聚焦效果
(1)光线与物体表面的求交计算
由光线方程和表面方程联立解出交点
光线方程:
(s:P0和P的距离)
光线和球面求交
光线和多面体求交
提高效率?
s
P
求交例:光线和球面/多面体
直接求交
根的正负性判断
用较小s代入
得到交点
球面
包围球测试
找到前向面
各个前向面:求交,内外测试
找到最近交点
多面体
反射光方向
折射光方向
求交效率的提高方法
物体包围球排除法
单个对象包围球
多个对象(或包围球)的包围球
空间分割方法
逐次将空间分割为若干子立方体
直至每个子立方体包含的物体表面或面片数目小于预定值
八叉树是一种均匀分割的选择
(2A)每个像素光强值计算
光线跟踪本质上是个递归算法,每个象素的光强度
必须综合各级递归计算的结果才能获得。
对每次计算——一部分是光源直接照射表面点产生
的光照效果(基本光照模型);另一部分是从属光
(由周围物体反射折射得到)照射表面点产生。
即:每次计算采用整体光照模型公式I=Il +Ig
Il —根据基本光照模型计算
Ig
=KRIR+KTIT
考虑了反射系数KR,折射系数KT
这些‘系数’均为和表面材质有关的常数
递归过程
从叶结点开始
由底向上遍历二叉树
在树的每一个结点处,
递归地调用整体光照模
型公式(每上升一层,
光强部分衰减)
累计光强度贡献直到二
叉树根结点。
IR 4 Ilight
IT 3 Ilight
IR3 Il 4 KR 4 IR 4
Il 3
Il 4
Il 5
IR5 Ilight
IR 2 Il 5 KR 4 IR5
IR1 Il 3 KR 3 IR 3 KT 3 IT 3
Il 1
I Il1 KR1 IR1 KT 1 IT 1
Il 2
IT 1 Il 2 KR 2 IR 2
(2B)模拟照相机聚焦效果
投影平面前假想安置薄透镜
指定聚焦长度( f=透镜中心到聚焦点F之间的距
离)等参数
薄透镜公式
如果
投影点不聚焦到投影平面
采用了光线跟踪计算,显示了由
物体表面生成的全局反射和透射
光效果。
一个茶壶的光线反射,其反射参数设置为模拟磨光的铝表
面,采用Monte-Carlo光线跟踪法绘制而成
光线跟踪反走样
过采样
一个象素是一个正方形
有多束光线穿过同一个象素
每束光线穿过子象素角点或中心
像素的最终光强=各束光线强度的平均值
适应性采样
分布式光线跟踪
四角不同或遇小物体时将象素细分
按照参数随机分布每个子象素上的光线位置
圆锥跟踪算法
确定锥形光束下,对象覆盖象素区域的百分比
十、辐射度光照模型
辐射度模型:利用辐射能在物体表面之间的转
移和能量守恒定律的漫反射模型。
物空间——计算表面亮度,与视点等无关
辐射度B 【瓦特/米2】 :单位时间内、单位面
积上离开表面的光能量。
强度I【瓦特/(米2·球面度)】:特定方向上
单位立体角内的辐射度
表面点发出的总辐射能=表面点为中心
的半球上所有方向辐射能的总和
辐射度Bk
入射能量Hk
n
Bk E k k B jFjk
j 1
表面1
B1F1k
表面2
B 2 F2k
表面K
表面j
n
B jFjk
H k B jFjk
j 1
幅射度公式
n
Bk E k k B jFjk
j 1
第k个面的幅射度。
Bk
Ek 单位时间、单位面积上从第k个面直接发出的能量。
ρk 第k个面的反射因子(与漫反射系数相关),表示入
射光中被反射回环境的部分。
Fjk 形状因子,定义为从第j个面出发的幅射能中可以到
达第k个面的部分。当所有的面都是具有理想漫反射性质
时,形状因子是纯几何量,仅与形状、大小、位置、以
及朝向有关。
形状因子的计算
Fjk =
投射到k表面的能量
离开j表面的总能量
对所有k(能量守恒)
对等光反射
对所有j(假设仅含平面片和凸面片)
辐射度模型下的光照计算
将场景表面分割为许多小多边形,设定“表面闭包”
计算形状因子(半立方体代替半球体)
列出闭包内所有表面的辐射度方程
联立求解(E,F,ρ都已知,求B)(Fkk=0,k=1,2…n)
计算(续)
(1)计算形状因子Fij;
(2)求解方程组,得出各面片的辐射度Bi;
(3)计算面片各顶点的亮度;
(4)观察投影变换;
(5)用线性插值法计算各象素点的亮度;
结合光线跟踪和辐射度方法生成场景
其它:添加表面细节
多边形模拟:简单图案、字等
叠加于场景表面上,光照参数选择优先级高
纹理映射(图案映射) :复杂精致的细节
凹凸映射:粗糙凹凸的表面
线性纹理、表面纹理、体纹理、过程式纹理
在光照模型计算中,对表面法向量进行扰动
帧映射:木纹、大理石等条纹
法向量和相应本地坐标系统的其它方向上同时扰动
(1)纹理映射
概念:纹理模式映射到对象表面
纹理模式
离散法:定义为数组
一维(线性)、二维(表面) 、三维(体)图案
纹理图案在纹理空间中用纹理坐标来定义
连续法:定义为修改表面光强值的过程(函数)
过程式纹理
纹理图案定义
n个(RGB)颜色
(s)[0,1]
nxn个(RGB)颜色
(s,t) [(0,0),(1,1)]
线性纹理数组
表面纹理数组
nxnxn个(RGB)颜色
(s,t,r) [(0,0,0),(1,1,1)]
体纹理数组
例子:表面纹理映射过程
纹理空间
纹理坐标
对象空间
世界坐标
象素空间
设备坐标
s =S(u,v)
t =T(u,v)
x,y,z
xp,yp,zp
观察投影
逆变换
表面参数
u=f(x,y,z)
v=g(x,y,z)
已知纹理
图案与表
面对应的
方式、基
准点等
(2)凹凸(扰动)映射
凹凸映射:在光照模型中引入扰动函数来修改表面法向量
在表面每一点沿其表面法向量方向附加一个新的向量——该向量
较小,不影响原表面的大致形状,但改变了该点处的原表面法向
量。
通过恰当选择扰动函数,可使生成图形具有不同的凹凸纹理效果。
P
z'(u,v) N
P (u, v )
若P(u,v)表示一个参数曲面上的点
该点处的表面法向量为:N﹦PuPv
Pv
Pu
o
Pu与Pv为P(u,v)关于参数u和v的偏导数
x
定义扰动函数F(u,v)
将物体表面上点P(u,v) 沿N方向位移F(u,v)个单位长,
得 P’(u,v)﹦P(u,v)﹢F(u,v)·n (n=N/|N|是单位法向量)
y
凹凸映射(续)
新的表面法向量 N’﹦Pu’Pv’
Pu’﹦P’/u=(P+F.n)/u﹦Pu﹢Fu·n﹢F·nu
Pv’﹦ P’/v=(P+F.n)/v﹦Pv﹢Fv·n﹢F·nv
F(u,v)的值很小,忽略不计:
Pu’﹦Pu﹢Fu·n
Pv’﹦Pv﹢Fv·n
N’﹦PuPv﹢Fu(nPv)﹢Fv(Pun)﹢FuFv(nn)
nn﹦0,故:N’﹦N﹢Fu(nPv)﹢Fv(Pun)
原法向量
扰动向量
最终,N’ 用于光照模型中计算曲面上点的光强度。
扰动函数的定义
连续法:
可以求导的任一函数基本都可取作扰动函数。
离散法:更常用
简单的位图作为扰动函数。
交互式图形系统作出的模拟纹理图案作为扰动函数。
图案中较暗(亮)的颜色对应于较小(大)的F值
图案中各象素的值用数组存储起来作为F值的查找表,
表上没包括的中间值可以由双线性插值方法求得。
凹凸映射效果图
(重复法比较适合橘子皮之类的表面
随机法比较适合葡萄干之类的表面)
OpenGL实现光照和纹理效果
GLubyte tex[4][4][4]= {
255,0,0,255,
255,0,0,255,
255,200,0,255, 255,200,0,255,
0,255,0,255,
0,255,0,255,
0,255,255,255, 0,255,255,255,
GLfloat color1[]={0, 0, 0},color2[]={1,1,1,1};
glLightfv(GL_LIGHT1,GL_POSITION, lightpos1);
glLightfv(GL_LIGHT1,GL_AMBIENT, color1);
glLightfv(GL_LIGHT1,GL_DIFFUSE, color2);
glLightfv(GL_LIGHT1,GL_SPECULAR, color2);
glEnable(GL_LIGHT1);
glLightfv(GL_LIGHT2。。。
glEnable(GL_LIGHT2);
glEnable(GL_LIGHTING);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
4,4, 0, GL_RGBA, GL_UNSIGNED_BYTE, tex);
glEnable(GL_TEXTURE_2D);
255,0,0,255,
255,200,0,255,
0,255,0,255,
0,255,255,255,
255,0,0,255,
255,200,0,255,
0,255,0,255,
0,255,255,255 };
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
glColor3f(1.0, 1.0, 1.0);
。。。
glBegin(GL_POLYGON);
glTexCoord2f(0,0); //指定纹理坐标
glVertex3f(ctrlPts[7][0],ctrlPts[7][1],ctrlPts[7][2]);
glTexCoord2f(1,0);
glVertex3f(ctrlPts[6][0],ctrlPts[6][1],ctrlPts[6][2]);
glTexCoord2f(1,1);
glVertex3f(ctrlPts[5][0],ctrlPts[5][1],ctrlPts[5][2]);
glTexCoord2f(0,1);
glVertex3f(ctrlPts[4][0],ctrlPts[4][1],ctrlPts[4][2]);
glEnd();
。。。
glEnable(GL_TEXTURE_2D);
glEnable(GL_LIGHTING);
GLubyte tex[4][4][4]=
{
255,0,0,255,
255,0,0,255,
255,0,0,255,
255,0,0,255,
255,200,0,255,
255,200,0,255,
255,200,0,255,
255,200,0,255,
0,255,0,255,
0,255,0,255,
0,255,0,255,
0,255,0,255,
glEnable(GL_LIGHTING);
glEnable(GL_TEXTURE_2D);
0,255,255,255,
0,255,255,255,
0,255,255,255,
0,255,255,255 };
3
4
2
1
glBegin(GL_POLYGON);
glTexCoord2f(0,0);
glVertex3f( 1 );
glTexCoord2f(1,0);
glVertex3f( 2 );
glTexCoord2f(1,1);
glVertex3f( 3 );
glTexCoord2f(0,1);
glVertex3f( 4 );
glEnd();
GLubyte tex[4][4][4]= {
255,0,0,255,
0,255,0,255,
255,255,0,255,
0,255,255,255,
255,255,0,255,
255,0,255,255,
0,0,255,255,
255,255,255,255,
255,0,150,255,
0,0,0,255,
0,255,0,255,
0,0,255,255,
100,100,100,255,
0,255,0,255,
0,0,255,255,
255,0,0,255 }
第9讲小结
基本光照模型
光强度显示
多边形绘制算法:明暗处理
光线跟踪方法
幅射度概念
纹理映射概念