提出问题

Phong光照模型Specular问题光线示意
Phong光照模型中,Specular的实现方式依赖于视角向量 dot 反射光向量,即 $$ spec = \overline{V} \cdot \overline{R} $$ 在右图情况下spec值为负值,导致当观察者与光照相对法线同侧时,对侧的光线会被减弱甚至消除,如图:
Phong光照模型Specular问题效果
使用Phong光照模型当中的Specular方法,会发现有一条分明的分界线这个不符合正常的光照效果。

解决问题:半程向量

Blinn-Phong半程向量光线示意
如图所示: $$ \overline{H} = \frac{\overline{L} + \overline{V}}{|L| + |V|} $$ 代码实现:

GLSL
vec3 halfwayDir = normalize(lightDir + viewDir);
spec = pow(max(dot(normal, halfwayDir)0.0), 1.0);
点击展开查看更多

使用半程向量与法线的夹角作为镜面反射值,这样物理观察者在哪侧,都不会出现负值。

效果:

Blinn-Phong光照模型效果

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/blinn-phong%E5%85%89%E7%85%A7%E6%A8%A1%E5%9E%8B/

许可证: CC BY-NC-SA 4.0

This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License. Please attribute the source, use non-commercially, and maintain the same license.

开始搜索

输入关键词搜索文章内容

↑↓
ESC
⌘K 快捷键