OpenGL学习脚印:Blinn-Phong光照模型
来源:互联网 发布:四宫格拍照软件是什么 编辑:程序博客网 时间:2024/05/17 06:59
写在前面
在前面基础光照部分,我们学习了Phong Shading模型,Blinn-Phong模型对Phong模型的镜面光成分进行了改进,虽然在物理上解释没有Phong好,但是能更好地模拟光照。本节代码可以在我的github下载。
本节内容整理自:
1.www.learnopengl.com
2.Blinn-Phong Model
Phong不能处理的情况
我们知道,Phong模型在计算镜面光系数为:
float specFactor = pow(max(dot(reflectDir, viewDir), 0.0), 32); // 32为镜面高光系数
这里的计算由反射向量和观察向量决定,当两者的夹角
而右图的这种情况实际上是存在的,将镜面光成分取为0,没有很好地体现实际光照情况。例如下面的图表示的是,镜面光系数为1.0,法向量为(0.0,1.0,0.0)的平面位置在-0.5,光源在原点时,观察者在(0,0,4.0)位置时,光照展示的情形:
这里我们看到,Phong的镜面光成分,在边缘时立马变暗,这种对比太明显,不符合实际情形。
为什么会产生这样一个光线明暗分明的情形? 我尝试这样推导,对此不感兴趣地可以跳过。
首先记表面位置为
法向量为:
根据reflect函数的计算原理,得到反射向量为:
设观察点位置为
那么反射向量和观察向量的点积为:
记
令
由此可以看出,位置在平面y=-0.5上的点,以适当位置观察时,会形成两个同心圆,在两个同心圆之间的部分则满足
也就是说当观察向量和反射向量超过90度,这种截断引起了明显的明暗对比,这种情形在Blinn-Phong中得到改善。
Blinn-Phong
Blinn-Phong模型镜面光的计算,采用了半角向量(half-angle vector),这个向量是光照向量L和观察向量V的取中向量,如下图所示(来自Blinn-Phong Model):
计算为:
当观察向量与反射向量越接近,那么半角向量与法向量N越接近,观察者看到的镜面光成分越强。
对比Phong和Blinn-Phong计算镜面光系数为:
vec3 viewDir = normalize(viewPos - fs_in.FragPos);float specFactor = 0.0;if(blinn) // 使用Blinn-Phong specular 模型{vec3 halfDir = normalize(lightDir + viewDir);specFactor = pow(max(dot(halfDir, normal), 0.0), 32.0); }else // 使用Phong specular模型{vec3 reflectDir = normalize(reflect(-lightDir, normal)); // 此时需要光线方向为由光源指出specFactor = pow(max(dot(reflectDir, viewDir), 0.0), 8.0); }
使用半角向量后,保证了半角向量H与法向量N的夹角在90度范围内,能够处理上面对比图中右图所示的情形。下面是镜面高光系数为0.5时使用Blinn-Phong渲染效果:
下图是镜面高光系数为0.5时使用Phong渲染效果:
一般地,使用Blinn-Phong模型时要得到相同强度的镜面光,镜面系数需要为Phong模型的2-4倍,例如Phong模型的镜面高光系数设置为0.8,可以设置Blinn-Phong模型的系数为32.0。
关于Phong和Blinn-Phong模型更多地对比,可以参考Relationship between Phong and Blinn lighting model。
- OpenGL学习脚印:Blinn-Phong光照模型
- Phong光照模型、Blinn-phong光照模型归纳
- 常用光照模型汇总:Lambert/Phong/Blinn-Phong光照模型
- <Shader>phong 光照模型和 blinn phong 模式
- Blinn-Phong 光照
- OpenGL学习: 光照系列1-光照基础(phong模型)
- 简单光照模型(Phong模型(镜面反射)与 Blinn-Phong光照模型(修正镜面光) )
- GPU实现“Blinn-Phong 光照模型”(Cg语言)
- opengl光照 Blinn-Phone模型与实现
- 关于Unity3D内置Blinn Phong光照模型计算在移动设备上的曝光问题
- 光照模型的计算方式总结(1.Diffuse分量2.Specular分量 Phong model和Blinn-Phong model (Or Blinn))
- phong 光照模型。。
- 简单phong光照模型
- OpenGL学习脚印: 光照基础(basic lighting)
- Shader基于顶点编程的Lambert光照,Phong光照和Blinn-Phong光照
- Shader基于片段编程的Lambert光照,Phong光照和Blinn-Phong光照
- 高光反射-逐像素光照(Blinn-Phong)
- OpenGL学习脚印: 模型变换(model transformation)
- 双向链表
- 色彩校正中的 gamma 值是什么?
- 再见,我的高中歌唱生涯
- Android判断手机屏幕是否亮着
- 【NOIP2016提高A组模拟】完美标号
- OpenGL学习脚印:Blinn-Phong光照模型
- Java设计模式之——原型模式
- java线程
- Arduino学习(九): 写一个Arduino扩展库:音乐播放库,并实现跨平台
- Android开发mac /dev/kvm is not found
- Windows 数字签名
- xcode 视图里面复制某个或者几个组件
- getResource()和getResourceAsStream以及路径问题
- QT5.7 deploys opencv2.4.13(the version of opencv is not newer than QT)