[computer graphics]简单光照模型(Phong和Blinn-Phong)和明暗处理
简单光照模型(Phong和Blinn-Phong)和明暗处理
支持点光源和平行光,是一种简单光照模型,它将光照分解成了三个部分,分别为
- 漫反射
- 镜面反射
- 环境光
如图所示,是一个简单的几何模型。
- \(L\)是光源方向
- \(N\)是法线方向
- \(R\)是反射方向
- \(V\)是视线方向
- \(H\)是\(L\)和\(V\)的平分
- 所有向量都是单位向量

理想漫反射
当光源来自一个方向时,漫反射均匀地向各个方向传播,与视点无关,是由物体表面粗糙不平引起的,漫反射的空间分布是均匀的,也就是说不论从哪个方向看去,同一个点的漫反射光强都是一样的。物体上的点\(P\),法向量为\(N\),入射光强度为\(I_p\),\(L\)为\(P\)指向光源的方向。如果所有所有的向量都是单位向量,那么有
\]
其中\(K_d=(K_{dr},K_{dg},K_{db})\)这三个分量分别是RGB三原色的漫反射系数,可以反应物体的颜色。同样的\(I_p=(I_r,I_g,I_b)\)可以通过分量来设置光源的颜色。
镜面反射
对于理想镜面,反射光集中在一个方向,并遵守反射定律。对于一般的光滑表面,反射光则集中在一个范围内,且反射定律决定的方向光强最大。所以从不同位置观察到的镜面反射光强不同。镜面反射光可表示为
\]
\(R \cdot V\)计算的是反射方向和视线方向的夹角,夹角越小,强度越大。\(n\)是反射指数,反应了物体的表面的光滑程度,一般1-2000。\(n\)越大约光滑,因为n越大,例如2000,那么当夹角很小时,例如很接近1,如0.9,但是经过2000乘方,就变得很小了,这意味着只有无限接近反射方向,才能看到高光,其他方向不行,这就表示物体很光滑。反过来,\(n\)很小那么移动一点角度,也能看到衰弱的高光,所以光斑会比较明显。
在镜面反射模型中,最终要的是计算R的方向,\(R\)可以通过入射方向和法线方向计算出来

因为这里的向量都是单位向量,只有方向不一致
||L||\cos\theta &= ||M||=\cos\theta\\
&M和N的方向一致\\
R &= -L+2M \\
&=2N\cos\theta-L\\
&=2N\cdot(N\cdot L)-L
\end{aligned}
\]
高光区域只反映光源的颜色,漫反射才能设定物体的颜色。
环境光
光源间接对物体施加的明暗影响,在物体和环境之间多次反射。在简单光照模型中进行了简化,通常用一个常数来模拟环境光
\]
\(I_a\)是环境光强,\(K_a\)为物体对环境光的反射系数。
Phong模型
\]
Phong模型是上述三种因素的叠加,其中\(R\)的计算比较费时,需要对每一点计算一次\(R\)的值。
Blinn-Phong模型
由于Phong模型计算较为耗时,后来提出了一种对Phong模型的修改,Blinn-Phong模型。
假设:
- 光源在无穷远处,光线的方向L为常数(这就意味着,对物体上所有点来说,光线的方向都是一致的,正常情况应该是光源到点的向量,每个点的光照方向都不一致)
- 视点在无穷远处,视线的防线V为常数(这个同理)
- 此模型针对高光部分进行了修改,\(R\cdot V\)的计算用\(H\cdot N\)近似,其中\(H=(L+V)/||L+V||\),也就是\(L\)和\(V\)的平分向量。当\(V\)接近\(R\)的时候,\(H\)也接近\(N\),符号高光的规律。对于所有点,\(H\)只需计算一次。
所以Blinn-Phong模型的可以表示成:
\]

(图片中应该采用了明暗处理,不仅是光照模型)
明暗处理
如今的物体大多数用多边形表示,一个多边形的法线方向一致,因此一个多边形内部的像素相同,而在邻接出可能会有突变,感觉不连续。为了让过度平滑,基本思想是:对多边形的顶点计算合适的光强度,在内部进行均匀插值。其中有两种主要的做法:
- 计算物体表面多边形顶点的光强,然后插值,求多边形内部光强。
- 对内部点的法向量进行插值,而顶点的法向量用相邻多边形的法向量的平均值得到。
Gouraud明暗处理(双线性光强插值)
基本算法
- 计算多边形顶点的平均法向量
- 用Phong模型计算顶点的平均强度
- 插值计算离散边上的各点光强
- 插值计算多边形区域内的各点光强
计算速度比简单光照模型有了很大的提高,解决了颜色突变问题,但是镜面反射效果不理想。
Phong明暗处理(双线性法向量插值)
和Gouraud方法基本类似,只不过是对法向量插值。多边形顶点的法向量用相邻多边形的法向量的平均值。而内部每个点都要计算法向量,用顶点的法向量插值得到。
这种做法效果好,可以产生正确的高光,但是计算量很大。

- [1]维基百科
- [2]计算机图形学基础教程 胡事民
[computer graphics]简单光照模型(Phong和Blinn-Phong)和明暗处理的更多相关文章
- 用DirectX12实现Blinn Phong
这次我们来用DirectX12实现一下基本的Blinn Phong光照模型.让我们再把这个光照模型的概念过一遍:一个物体的颜色由三个因素决定:ambient, diffuse, specular.am ...
- Fundamentals of Computer Graphics 中文版(第二版) (Peter Shirley 著)
1 引言 2 数学知识 3 光栅算法 4 信号处理 5 线性代数 6 矩阵变换 7 观察 8 隐藏面消除 9 表面明暗处理 10 光线追踪 11 纹理映射 12 完整的图形流水线 13 图形学的数据结 ...
- 水题 HDOJ 4716 A Computer Graphics Problem
题目传送门 /* 水题:看见x是十的倍数就简单了 */ #include <cstdio> #include <iostream> #include <algorithm ...
- Mathematics for Computer Graphics数学在计算机图形学中的应用 [转]
最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=10509 [译]Mathematics for Computer Gra ...
- Mathematics for Computer Graphics
Mathematics for Computer Graphics 最近严重感觉到数学知识的不足! http://bbs.gameres.com/showthread.asp?threadid=105 ...
- HDUOJ----A Computer Graphics Problem
A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- Computer Graphics Research Software
Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...
- Computer Graphics Thinking–texture tiling
Here is one question: how to tile texture? One thing worth to notice: The DirectX and OpenGL stipula ...
- HDU 4716 A Computer Graphics Problem
A Computer Graphics Problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
随机推荐
- vue中mixins的使用方法和注意点(详)
mixins基础概况 vue中的解释是这样的,如果觉得语言枯燥的可以自行跳过嘿~ 混入 (mixins): 是一种分发 Vue 组件中可复用功能的非常灵活的方式.混入对象可以包含任意组件选项.当组件使 ...
- nginx+vue+uwsgi+django的前后端分离项目部署
Vue+Django前后端分离项目部署,nginx默认端口80,数据提交监听端口9000,反向代理(uwsgi配置)端口9999 1.下载项目文件(统一在/opt/luffyproject目录) (1 ...
- day07:集合的使用0220
list_1=set([4,5,6,7])list_2=set([4,8,9])list_3=set([4,5])list_4=set([6,7])a = (2,3)b = (2) #list_3是l ...
- zabbix监控redis多实例cpu mem-自动发现
1.自动发现实例端口脚本,用于zbx item prototypes #!/bin/bash REDIS_PORT=`ps aux |grep redis-server | grep -v 'grep ...
- 百度编辑器ueditor异步载入的操作方法
http://www.dookay.com/zh-cn/n/928 百度编辑器ueditor异步载入的操作方法 Time:2014-09-30 | View:830 | Source:佚名 返回列表 ...
- slf4j、log4j、 logback关系详解和相关用法
slf4j log4j logback关系详解和相关用法 写java也有一段时间了,一直都有用slf4j log4j输出日志的习惯.但是始终都是抱着“拿来主义”的态度,复制粘贴下配置文件就开始编码了, ...
- ShoneSharp语言(S#)的设计和使用介绍系列(6)— 字符串String
ShoneSharp语言(S#)的设计和使用介绍 系列(6)— 字符串String 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneS ...
- 【Mood】出大问题(最近很喜欢说这句话)
开学两周啦,第一周来了一次开学考,是崩了,还好没公布成绩和排名. 这两周下了一个很大的决心,准备转型/专注文化课,初三一次信息学奥赛比赛后就不学了,先保证能上高中重点班(如果有的话). 因为现在起步太 ...
- Algorithms - Data Structure - Perfect Hashing - 完全散列
相关概念 散列表 hashtable 是一种实现字典操作的有效数据结构. 在散列表中,不是直接把关键字作为数组的下标,而是根据关键字计算出相应的下标. 散列函数 hashfunction'h' 除法散 ...
- 剑指Offer之调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变. 思路:将奇数放进 ...