环境光和漫反射

Download Report

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.L0
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﹦PuPv

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’﹦PuPv﹢Fu(nPv)﹢Fv(Pun)﹢FuFv(nn)

nn﹦0,故:N’﹦N﹢Fu(nPv)﹢Fv(Pun)
原法向量

扰动向量
最终,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讲小结






基本光照模型
光强度显示
多边形绘制算法:明暗处理
光线跟踪方法
幅射度概念
纹理映射概念