OpenGL 4.0 GLSL 用单光源 实现逐顶点 漫反射光照模型
2014-02-11 14:21
666 查看
漫反射光照模型是:在所有方向上反射的光照强度相等,光照射到物体表面上一部分会被吸收而另一部分在其他方向上散射。一个典型的漫反射表面是没有光泽的,而没有被照射的地方是黑色的。
下面显示了一个漫反射光照模型
漫反射的数学模型包含两个向量:从物体表面的点到光源的的向量S 和 物体表面的某一点的法线向量N。如图:
到达物体表面的光照强度很大一部分依赖于物体表面的朝向,当物体的法线方向和光照方向平行 则光照强度最大,当光照方向和这点的法线垂直 则光照强度为0。在这 中间
光照强度同 N与S的余弦值程比例,因此 我们可以用S与N的点积来来表达照射到物体表面的光照强度
Ld 是光源的光照密度,s和n都是单位向量
前面说过 在光被射入到人眼中前 有一部分光被物体吸收 ,设光的反射系数为Kd 则 最终射入人眼的光照强度为
漫反射光照模型只和光源的位置和法线有关 而与摄像机(viewer)的位置无关
顶点shader
片元shader
下面显示了一个漫反射光照模型
漫反射的数学模型包含两个向量:从物体表面的点到光源的的向量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); }
相关文章推荐
- UnityShader初级篇——实现逐顶点漫反射光照模型
- Shader自学笔记 2.1.1 逐顶点漫反射光照模型实现
- OpenGL 4.0 GLSL 用多个光照模型
- OpenGL 4.0 GLSL 采用平行光照模型
- Unity shader学习之逐顶点漫反射光照模型
- OpenGL光源、材质和光照模型
- 基于GPU实现的经典光照模型算法:漫反射模型(使用cg语言实现)
- HLSL实现漫反射光照模型
- 实现 逐顶点的 ambient, diffuse, and specular (ADS) shading phong 光照模型
- CSharpGL(13)用GLSL实现点光源(point light)和平行光源(directional light)的漫反射(diffuse reflection)
- unity Shader 的漫反射逐顶点的光照模型
- Shader自学笔记 2.1.2 逐像素漫反射光照模型实现
- 【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享
- 【OpenGL4.0】GLSL-使用Uniform Block实现着色器的数据共享
- opengl光照 Blinn-Phone模型与实现
- OpenGL 4.0 GLSL 实现 投影纹理映射(Projective Texture Mapping)
- OpenGL4.0 GLSL 实现逐片元光照模型 提高场景真实性
- Unity3D - Shader - 实现漫反射光照模型
- OpenGL 4.0 GLSL 实现 平面着色 Implementing flat shading
- CSharpGL(39)GLSL光照示例:鼠标拖动太阳(光源)观察平行光的漫反射和镜面反射效果