Pong光照模型示意

Ambient

环境光

GLSL
float ambientStrength = 0.1;
vec3 ambient = ambientStrength * lightColor;
点击展开查看更多

Diffuse

入射光线越靠近物体法线漫反射越强

GLSL
// 计算漫反射值(光照向量 dot 法线)
// 注意会出现负值
float diff = max(dot(lightDir, Normal), 0.0);
// 合并
vec3 diffuse = diff * lightColor;
点击展开查看更多

Specular

视角向量越靠近出射光线镜面反射越强

GLSL
// 强度系数
float specularStrength = 0.5;
float shininess = 32
// 计算反射光方向向量(光照向量 dot 法线)
vec3 reflectDir = reflect(-lightDir, Normal);
// 计算镜面反射值(视角向量 dot 反射向量)
// shininess:此处pow的意义在于使光斑收敛更快(控制硬度)
float spec = pow(max(dot(viewDir, reflectDir), 0.0), shininess);
// 合并
vec3 specular = specularStrength * spec * lightColor;
点击展开查看更多

Phong

最终效果

GLSL
vec3 result = (ambient + diffuse + specular* objectColor;
点击展开查看更多

版权声明

作者: Chaim

链接: https://chaim.eu.org/posts/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 快捷键