首页 > 代码库 > RenderMonkey 练习 第二天 【opengl 光照模型】

RenderMonkey 练习 第二天 【opengl 光照模型】

光照模型

3D渲染中, 物体表面的光照计算公式为:

I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular);

 

其中,环境光(ambient)计算公式为:

Iambient = Aintensity * Acolor ;             (Aintensity表示环境光强度,Acolor表示环境光颜色)

 

漫反射光(diffuse)计算公式为:

Idiffuse = Dintensity*Dcolor*N.L ;                   (Dintensity表示漫反射强度,Dcolor表示漫反射光颜色,N为该点的法向量,L为光源向量)

 

镜面光照(specular)计算公式为:

Ispecular = Sintensity*Scolor*(R.V)n ;         (Sintensity表示镜面光照强度,Scolor表示镜面光颜色,R为光的反射向量,V为观察者向量)

 

综上所得:整个光照公式为:

I = Aintensity * Acolor +Dintensity*Dcolor*N.L + Sintensity*Scolor*(R.V)n ;

将一些值合并,并使用白色作为光照颜色,则上述公式可简化为:

I = A + D*N.L + (R.V)n

漫反射光照:

1. 打开RenderMonkey, 右击WorkSpace的Effect WorkSpace结点,选择Add Default Effect->OpenGL->OpenGL;

2. 添加物体位置矩阵:右击Effect节点 选择 Add Variable->Matrix->PreDefined->matWorld

技术分享

3. 添加光源向量: 右击Effect节点选择Add Variable->float->float4;  修改名称为vecLightDir, 双击设置其值

技术分享

4. 编写Vertex Shader:

uniform vec4 vecLightDir;
uniform mat4 matWorld;
varying vec3 light;
varying vec3 normal;

void main(void)
{
   gl_Position = ftransform();
   light = normalize(vecLightDir.xyz);
   normal = normalize(vec4(gl_Normal.xyz,1.0) * matWorld).xyz;   
}

5.    编写Pixel Shader:

varying vec4 light;
varying vec3 normal;

void main(void)
{
   vec4 diffuse = vec4(1.0,1.0,1.0,1.0);
   vec4 ambient = vec4(0.3,0.2,0.1,1.0);
   //gl_FragColor = vec4( 0.4, 0.5, 0.9, 1.0 );
   gl_FragColor = ambient + diffuse*clamp(dot(light,normal),0.0,1.0);
}

6. 预览效果

技术分享

 

RenderMonkey 练习 第二天 【opengl 光照模型】