简介

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 \theta | * f; \]

image

posted on 2021-11-06 17:04  HDU李少帅  阅读(230)  评论(0编辑  收藏  举报