简介
lambert 光照模型可以说是最简单的光照模型了. 主要考虑了 漫反射. 漫反射也单单考虑了经验模型.
主要观察 面片渲染器(我是这么叫的)
参考链接
https://zhuanlan.zhihu.com/p/191561026
https://zhuanlan.zhihu.com/p/144681176
code
#version 420
out vec4 FragColor;
in vec3 pos;
in vec3 color;
uniform int colormode = 1;
uniform int drawmode = 1;
void main() {
if(colormode == 0){
FragColor = vec4(color,1.0);
} else if (colormode == 1) {
if(drawmode == 0){
FragColor = vec4(0.25,0.25,0.25,1.0);
} else {
vec3 n = normalize(cross(dFdx(pos),dFdy(pos)));
vec3 lposition = vec3(0.0f,0.0f, 255f);
vec3 viewposition = vec3(0.0f,0.0f, 0.5f);
float f = 0.6f;
float ambient_light_coefficient = 0.4f;
vec3 ambient = vec3(0.6f, 0.6f, 0.6f);
vec3 lightDir = normalize(lposition - pos);
vec3 color_diffuse = ambient * max(0.0, dot(n, lightDir)) * f;
FragColor = vec4(color_diffuse,1.0);
}
} else {
FragColor = vec4(1.0, 0.0, 0.0, 1.0);
}
}
核心代码讲解
vec3 color_diffuse = ambient * max(0.0, dot(n, lightDir)) * f;
漫反射 = 光照强度(环境光) * 光照向量和物体表面法向量的余弦值 * 反射系数;
注: 余弦值是正值, 最小值为0, 表示没有光照影响.
注: 余弦值的计算为 两个单位向量的点乘.
[diffuse = light_{ambient} * | cos heta | * f;
]