Phong光照以及其他
在说光照之前,有必要先弄清法线的变换,假设Mworld 将物体的定点一一变换到世界空间,如果我们对法线实施同样的变化,,以为能将法线变换到世界空间,但世界上变换之后的法线不再与表面垂直,就像下图:


这意味着变换并不维持正交的性质,当然,不是所有的矩阵都会出现这种情况,只有当转换操作中包含非均匀缩放操作(XYZ各个方向缩放量不一样)时,这时候就不会再正交,这也意味着大部分的平移操作,旋转操作,均匀缩放操作或者上述组合都是能直接变换得,如何推导这个矩阵,方法有很多,(数学家们并未找出一个非常优雅的证明,我就从书上挪用下好了)
显然,变换之前 : (V1 – V0)*n = 0;我们将其n转置,写成矩阵乘法((V1 – V0)*
nT = 0;),就是一个 1 * 2的矩阵 乘上一个 2*1的矩阵 ,为了简单起见,将V1 – V0 记做U,那么就是U* nT = 0
好了,开始推导,其实我们事先可以知道要求的目标矩阵是(Mworld )-1 T
我们要找一个矩阵B 能使 (U* Mworld) * ( n * B) = 0,即维持正交特性,简单起见,将Mworld 记做A
首先,由于要加入A的逆,我们便可以在原式里面插入 A-1 *A ,(注意,A总是可逆的) ,这样并不影响原式A-1 *A = I ,:即式子变成这样:u(AA-1) nT = 0
注意,矩阵满足结合律,这样我们变可以将U与A结合尽量朝目标式子靠近 ,即: (uA)(A-1 nT) = 0
由于我们还需要一次转置,于是我们对(A-1 nT)
实施两次转置,这样并不 改变结果,于是得到下式: (uA) ((A-1 nT)T)T = 0
我们这下消去一些T,利用 (AB)T = BT AT ,于是变成:
(uA) (n(A-1)T)T
注意这是个矩阵乘法,现在我们需要变换回来,又将其变回点积,即去掉最外面的那个T就行了:
uA*n(A-1)T = 0
结果已经出来了,即 B = (A-1)T
这是个证明而不是求导,希望读者注意到这一点,如何求导出来,读者自行研究吧
正题:光照
现实中的光照何其炫丽,当然.这一切离不开物理学,首先进入Lamberat 余弦定理(定律?) 这是个很常见的现象,光照强度与法线和光照方向成的角度的余弦成正比,即:

θ指的是L与N所成角度,L指光照方向,n是物体(表面)的法线方向,如果L,N都是标准化的那么 cosθ = L*n 很显然的,因为模长为1
这个定理暂时放在这里,先简易介绍下Phong光照模型:
事实上,光是非常复杂的,因为他具有波粒二向性,不考虑如此复杂的情况,也需要考虑对象表面处的入射辐射度已经抵达眼睛的出射辐射度,两者之间的关系可用BRDF描述,但是还是太复杂了(对于我来说).BRDF的简化版本并可通过Phong光照来模拟,实际上,实时光照效果伴随着GPU的发展已经逐渐脱离了Phong光照模型,尽管如此,从基础开始总是最好不过的了.
Phong光照中,对象表面上一点的颜色由四项定义,即 漫反射(diffuse) ,镜面反射(specular),环境光(ambient)以及反射光.其中,漫反射和镜面反射来源于光源的光线,环境光用于模拟间接光照,发射光则是自发光对象了.接下来让我详细说之:
漫反射
考虑一个粗糙的表面,考虑最简单的光照情况,光照强度不随距离缩减,并到达一个表面时,沿着各个方向 均匀反射,由于反射光沿所有方向均匀反射,无论从那个方向观察,表面亮度均相同,使用时,无需考虑观测者的位置,至于Lamberat定理有关联(漫反射计算是视角独立的).一般的,将漫反射拆成两部分,一部分是光源的漫反射系数,一部分是材质的漫反射系数.将光照的记成Ld,材质的记为Md,那么反射光等于:
C = Ld * Md * f(θ) = Ld * Md * max(L.n,0)
各个方向均匀反射,所以不用考虑视点(相机)的位置
环境光
考虑到某些物体并没有处于光照的直接照射下,却某些部分会被照亮,因为其他物体对光的反射,想要模仿这类反射光,环境光是个不错的选择,由于光在场景中经多次反射并从各个方向抵达表明最终点,那么在各个方向上的以都是等强度的(这并不符合物理),这意味着,该光照与法线无关,也与视见方向无关,直接可以简单的写成 Sa * Ma
镜面光
前面已经说过粗糙平面,如果是光滑的如同镜子了,这个时候遵循反射定理,入射光和反射光与法线所成角度相等,但是值得注意的是,反射光不一定会朝着眼睛(相机)的方向,如下图

这说明计算是视角依赖的,与角度的余弦成正比(反射方向与视角方向的夹角),为了更加健康的模拟此光照,当达到一定角度时,这种光照不贡献任何强度,有个近似的模拟强度的函数,函数如下
(r*v) sh ,r为反射方向,v为眼睛和顶点所成的方向,sh表示对象表面的光滑程度,即模拟了达到一定角度时,强度贡献的衰弱,当然,只写成这样是有问题的,因为l,n的方向所成不一定是锐角,成〉=90度时是下面这种情况,还有就是r*v 小于0也是不正确的,所以,公式


这是系数,然后再乘上Ss*Ms即得出了镜面反射
至于发射光,可简单的定义为Me
我们已经简单的讲诉了光的几种成分,但没有区别光的不同类型,比如方向光,点关,聚光灯,下节再介绍了~
Phong光照以及其他的更多相关文章
- Unity-Shader-镜面高光Phong&BlinnPhong-油腻的师姐在哪里
[旧博客转移 - 2016年4月4日 13:13 ] 油腻的师姐: 以前玩过一款很火热的端游<剑灵>,剑灵刚出来的时候,某网页游戏广告视频中有句台词:"我不断的在寻找,有你的世界 ...
- Obj模型功能完善(物体材质,光照,法线贴图).Cg着色语言+OpenTK+F#实现.
这篇文章给大家讲Obj模型里一些基本功能的完善,包含Cg着色语言,矩阵转换,光照,多重纹理,法线贴图的运用. 在上篇中,我们用GLSL实现了基本的phong光照,这里用Cg着色语言来实现另一钟Blin ...
- Voreen(三) 光线投射参数介绍
本篇介绍光线投射的第二个个制Pass,光线合成的参数,对应于第一篇总的流程介绍中的Processor SingleVolumeRaycaster.可设置的参数如下: 1,Sampling Rate 采 ...
- Opentk教程系列-1绘制一个三角形
本系列教程翻译自Neo Kabuto's Blog.已经取得作者授权. 本文原文地址http://neokabuto.blogspot.com/2013/02/opentk-tutorial-1-op ...
- Qt3D
---------------------------------------------- 概述 - 请阅读QtHelp: Qt 3D Overview https://www.kdab.com/o ...
- OpenTK教程-1绘制一个三角形
OpenTK的官方文档是真心的少,他们把怎么去安装OpenTK说的很清楚,但是也就仅限于此,这有一篇learn opentk in 15的教程(链接已经失效,译者注),但是并不完美.你可以在15分钟内 ...
- Shader开发之三大着色器
固定功能管线着色器Fixed Function Shaders 固定功能管线着色器的关键代码一般都在Pass的材质设置Material{}和纹理设置SetTexture{}部分. Shader &qu ...
- 一步一步学RenderMonkey(4)--点光源光照模型 【转】
转载请注明出处:http://blog.csdn.net/tianhai110 点光源光照模型: 公式: I = Icolor*attenuation; ...
- unity surface shader 1
Unity ShaderLib : CGPROGRAM ENDCG之间是CG代码,之外的代码功能都由ShaderLib提供,CG中的一些方法比如tex2D(...)也是ShaderLib对CG进行 ...
随机推荐
- 树上的DP
CF#196B http://codeforces.com/contest/338/problem/B 题意:在一颗树上,给m个点,求到所有m个点距离不超过d的点的个数,所有路径长度为1. 分析:问题 ...
- day09(sql基础01)
SQL语言的分类 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL. 1:数据查询语言DQL Q = Query 数据查询语言DQL用于检索 ...
- TCP三次握手及四次挥手详细图解(未完)
TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: (完成三次握手,客户端与服务器开始传送数据) 所谓三次握手(Three-way Handshake),是指建立一 ...
- cisco tftp 备份/恢复
使用tftp服务器对cisco 3560 配置备份及恢复 Switch#copy running-config tftp:Address or name of remote host []? 192. ...
- MSDN上面测试Window的方法(很好用)
如何:将 Windows 服务作为控制台应用程序运行 向你运行 OnStart 和 OnStop 方法的服务添加一个方法: internal void TestStartupAndStop(s ...
- LeetCode 刷题记录(二)
写在前面:因为要准备面试,开始了在[LeetCode]上刷题的历程.LeetCode上一共有大约150道题目,本文记录我在<http://oj.leetcode.com>上AC的所有题目, ...
- C# 扩展方法奇思妙用高级篇六:WinForm 控件选择器
在Web开发中,jQuery提供了功能异常强大的$选择器来帮助我们获取页面上的对象.但在WinForm中,.Net似乎没有这样一个使用起来比较方便的选择器.好在我们有扩展方法,可以很方便的打造一个. ...
- IIS6.0禁止用户下载txt文件
服务器win2003+IIS6.0,在IIS上限制下载.txt文件,方法比较简单,在IIS的应用程序扩展名映射中为资源扩展名指定一个错误的可执行文件即可. 打开记事本,直接将空内容保存为C:\WIND ...
- linux中less命令使用
less与cat和more的区别: cat命令功能用于显示整个文件的内容单独使用没有翻页功能因此经常和more命令搭配使用,cat命令还有就是将数个文件合并成一个文件的功能. more命令功能:让画面 ...
- Mac生存手册
最近刚从Linux转到了Mac系统上,感觉好的地方是再也不折腾了,什么GNOME, KDE, XFCE,各种发行版本都远离我而去了.当然Mac下很多好软件都是要付费的,我只能绕着走了: 1. 命令行, ...