OpenGL学习脚印:Blinn-Phong光照模型

本文介绍了Blinn-Phong光照模型,它改进了Phong模型的镜面光成分,解决了Phong模型在某些情况下无法准确模拟光照的问题。通过引入半角向量,Blinn-Phong模型能更好地处理镜面光超过90度的情况,避免了明显的明暗对比。
摘要由CSDN通过智能技术生成

写在前面
在前面基础光照部分,我们学习了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为镜面高光系数

这里的计算由反射向量和观察向量决定,当两者的夹角 θ 超过90时,截断为0.0,则没有了镜面光成分。因此Phong模型能处理的是下面的左图中( θ90 )的情况,而对于右图中( θ>90 )的情况则镜面光成分计算为0(来自Advanced-Lighting)。
这里写图片描述

而右图的这种情况实际上是存在的,将镜面光成分取为0,没有很好地体现实际光照情况。例如下面的图表示的是,镜面光系数为1.0,法向量为(0.0,1.0,0.0)的平面位置在-0.5,光源在原点时,观察者在(0,0,4.0)位置时,光照展示的情形:

phong模型的边缘问题

这里我们看到,Phong的镜面光成分,在边缘时立马变暗,这种对比太明显,不符合实际情形。


为什么会产生这样一个光线明暗分明的情形? 我尝试这样推导,对此不感兴趣地可以跳过。

首先记表面位置为 fragPos=(x,0.5,z) , 光源位置为 lightPos=(0.0,0.0,0.0) ,则光照向量为:

L=(lightPosfragPos)=(x,0.5,z)(light direction)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值