OpenGL 4.0 GLSL 用单光源 实现逐顶点 漫反射光照模型

漫反射光照模型是:在所有方向上反射的光照强度相等,光照射到物体表面上一部分会被吸收而另一部分在其他方向上散射。一个典型的漫反射表面是没有光泽的,而没有被照射的地方是黑色的。


下面显示了一个漫反射光照模型



漫反射的数学模型包含两个向量:从物体表面的点到光源的的向量S 和 物体表面的某一点的法线向量N。如图:



到达物体表面的光照强度很大一部分依赖于物体表面的朝向,当物体的法线方向和光照方向平行  则光照强度最大,当光照方向和这点的法线垂直 则光照强度为0。在这 中间

光照强度同 N与S的余弦值程比例,因此 我们可以用S与N的点积来来表达照射到物体表面的光照强度


Ld 是光源的光照密度,s和n都是单位向量


前面说过  在光被射入到人眼中前 有一部分光被物体吸收  ,设光的反射系数为Kd 则  最终射入人眼的光照强度为



漫反射光照模型只和光源的位置和法线有关   而与摄像机(viewer)的位置无关

顶点shader


#version 430

layout (location = 0) in vec3 VertexPosition;
layout (location = 1) in vec3 VertexNormal;

out vec3 LightIntensity;

uniform vec4 LightPosition; // Light position in eye coords.
uniform vec3 Kd;            // Diffuse reflectivity
uniform vec3 Ld;            // Diffuse light intensity

uniform mat4 ModelViewMatrix;
uniform mat3 NormalMatrix;
uniform mat4 ProjectionMatrix;
uniform mat4 MVP;

void main()
{
    vec3 tnorm = normalize( NormalMatrix * VertexNormal);
    vec4 eyeCoords = ModelViewMatrix * vec4(VertexPosition,1.0);
    vec3 s = normalize(vec3(LightPosition - eyeCoords));

    LightIntensity = Ld * Kd * max( dot( s, tnorm ), 0.0 );

    gl_Position = MVP * vec4(VertexPosition,1.0);
}


片元shader

#version 430

in vec3 LightIntensity;

layout( location = 0 ) out vec4 FragColor;

void main() {
    FragColor = vec4(LightIntensity, 1.0);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值