码迷,mamicode.com
首页 > 编程语言 > 详细

Blinn-Phong光照算法

时间:2020-05-06 21:22:38      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:部分   就是   相加   通过   png   方式   渲染   info   解决   

Phong光照模型是计算机图形学中一种非常基础的光照算法,它的高光部分计算公式如下:

specular=pow(max(0,dot(viewDir, reflectDir)),shininess)

其中viewDir是相机坐标和物体坐标之差,reflectDir是光照方向与物体法向的反射,如下图所示:
技术图片
但是这种计算方式有一个问题,如下图所示:
技术图片
当相机和光照处于同一侧时,此时得到的反射向量reflectDir和视角的方向viewDir的夹角已经大于90度,因此通过dot计算得出的值为负数。表现在渲染结果中就是当相机转到某个角度的时候,高光反射会突然消失,显得很不自然:
技术图片
为了解决这个问题,James F.Blinn与1977年提出了Phong模型的改进算法:Blinn-Phong光照算法。该算法相比于Phong增加了HalfDir的概念,如图所示:
技术图片
HalfDir是光照方向和视角方向的相加并归一化,最终比较的是它和normal的夹角。因为HalfDir和normal的夹角永远不会高于90度,因此不用担心dot值出现负数的情况。计算代码如下所示:

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); 

通过增加了HalfDir,高光变换更加自然,下图展示了Phong和Blinn-Phong的渲染比较:
技术图片

Blinn-Phong光照算法

标签:部分   就是   相加   通过   png   方式   渲染   info   解决   

原文地址:https://www.cnblogs.com/wickedpriest/p/12838820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!