zoukankan      html  css  js  c++  java
  • Blinn-Phong光照算法

    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的渲染比较:

  • 相关阅读:
    left join的多重串联与groupby
    转换坐标为数字型的函数
    oracle 11g 导出空表
    sql优化
    pl/sql使用技巧
    佳能mp288拆解步骤--绝对原创
    转)delphi chrome cef3 控件学习笔记 (二)
    mac, ios 模拟器
    一个人软件独立开发。
    Delphi在Android下通过WiFI进行调试
  • 原文地址:https://www.cnblogs.com/wickedpriest/p/12838820.html
Copyright © 2011-2022 走看看