首页 > 代码库 > 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 光照模型】