OpenGL3.3Blinn-Phong光照

本文深入探讨了Blinn-Phong光照模型,对比冯氏模型,介绍了如何通过半程向量解决镜面反射问题,提升光照效果的真实感。详细解释了Blinn-Phong算法,并讨论了其在实际应用中的优势。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Blinn-Phong光照
这个光照是在冯氏光照之后的一种改良
但是冯氏光照有个缺点
假设一个场景,这个物体的反光度很低 也就是说他的漫反射产生的亮度很低
在这个时候微弱的镜面反射就会对整个物体产生影响 然而此时你在背光处(也就是灯在你的身后方)此时就会发生
此时情况就是右边的情况
此时情况就是右边的情况
这样就会发生有的地方会突然消失镜面反射(因为夹角大于了90)就会发生下面的情况左边的是冯氏光照,右边的是Blinn-Phong光照
所以为了解决这个问题Blinn-Phong光照提出了半程向量即光线与视线夹角一半方向上的一个单位向量。当半程向量与法线向量越接近时,镜面光分量就越大。
算法是`:

vec3 lightDir   = normalize(lightPos - FragPos);
vec3 viewDir    = normalize(viewPos - FragPos);
vec3 halfwayDir = normalize(lightDir + viewDir);`
float spec = pow(max(dot(normal, halfwayDir), 0.0), shininess);

Blinn-Phong与冯氏模型唯一的区别就是,Blinn-Phong测量的是法线与半程向量之间的夹角,而冯氏模型测量的是观察方向与反射向量间的夹角。
因为是半程向量 所以一般夹角会比真实的夹角小一些 所以我们提高反光度至原来冯氏光照的2-4倍就行

光照理论

请添加图片描述

不是应该反射入眼睛的才是镜面高光吗

按现实来说 应该是计算每一个像素如果这个像素的反射光线会正好射入眼睛才是镜面反射 但是我们这里并不是 只是做了一个点乘 最终得出来的是镜面反射度 也就是这个点乘值越大 反射光线越靠近眼睛就高光越大 主要是因为分辨率不够的原因导致一个像素可能对应的是多个纹素 导致一些像素上完全没有高光,看起来是不自然的 实际上就是起到一个模糊的效果
请添加图片描述
请添加图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值