光照模型

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->float->float4;  修改名称为vecLightPosition, 双击设置其值

4. 编写Vertex Shader:

uniform vec4 vecLightPosition;

varying vec3 lightdir;
varying vec3 normal;

void main(void)
{
   gl_Position = ftransform();  
   normal = normalize(gl_NormalMatrix * gl_Normal);
   vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
   lightdir = normalize(vecLightPosition.xyz - fvObjectPosition.xyz);  
}

5.    编写Pixel Shader:

varying vec3 lightdir;
varying vec3 normal;

void main(void)
{
   vec4 diffuse = vec4(0.8,0.8,0.8,1.0);  
   vec4 ambient = vec4(0.3,0.2,0.1,1.0); 
   
   vec3 lightDirection = normalize(lightdir);
   float fNDotL = dot(normal,lightDirection);  
 
   gl_FragColor = ambient + fNDotL * diffuse ;
}

6. 预览效果

镜面反射光照:

1. 添加光源位置 vecLightPosition

2. 添加相机位置 vecEye

3. 顶点shader

uniform vec4 vecLightPosition;
uniform vec4 vecEye;

varying vec3 lightdir;
varying vec3 normal;
varying vec3 viewdir;

void main(void)
{
   gl_Position = ftransform();  
   normal = normalize(gl_NormalMatrix * gl_Normal);
   vec4 fvObjectPosition = gl_ModelViewMatrix * gl_Vertex;
   lightdir = normalize(vecLightPosition.xyz - fvObjectPosition.xyz);   
   viewdir = normalize(vecEye.xyz - fvObjectPosition.xyz);
}

4. 片元shader

varying vec3 lightdir;
varying vec3 normal;
varying vec3 viewdir;

void main(void)
{
   vec4 diffuse = vec4(0.8,0.8,0.8,1.0);  
   vec4 ambient = vec4(0.3,0.2,0.1,1.0);   
   vec4 specular = vec4(0.0,0.0,0.0,1.0);
   
   vec3 lightDirection = normalize(lightdir);
   vec3 viewDirection = normalize(viewdir);
   float fNDotL = dot(normal,lightDirection);
   
   vec3 Reflection = normalize(2 * fNDotL * normal - lightDirection);
   
   float fRDotV = dot(Reflection,viewDirection);

/* compute the specular term if NdotL is  larger than zero */
   if (fRDotV > 0.0)
   {
      specular = vec4(0.49,0.48,0.49,1.0) * pow(fRDotV,8.0);
   }
   gl_FragColor = ambient + fNDotL * diffuse + specular;
}

5. 效果图

RenderMonkey 练习 第二天 【opengl 光照模型】的更多相关文章

  1. RGBA HSB opengl光照模型

    RGBA HSB   HSV颜色模型对应于画家的配色的方法.画家用改变色浓和色深的方法来从某种纯色获得不同色调的颜色.其做法是:在一种纯色中加入白色以改变色浓,加入黑色以改变色深,同时加入不同比例的白 ...

  2. OpenGL ES 光照模型之——环境光照(RenderMonkey测试)

    概述及目录(版权所有,请勿转载 www.cnblogs.com/feng-sc/) 本文总结如何在RenderMonkey下做简单的OpenGL ES环境光光照模型测试. 主要包括如下内容: 1.使用 ...

  3. 【转】OpenGL基础图形编程(二)

    原文:http://blog.chinaunix.net/uid-20638550-id-1909184.html  分类: 十一.位图与图像 11.1.位图 11.1.1 位图(Bitmap)与字符 ...

  4. openGL光源概念

    1. 光照模型      环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失. 全局环境光——每个光源都能对场景提供环境光.此外,还有一个环境光,它不来自 ...

  5. C#+OpenGL编程之再见小桃子(The Tao Framework)

    本文基础: C#+OpenGL编程之OpenGL 纹理载入 C#+OpenGL编程之OpenGL 多重纹理 小桃子The Tao FrameworkTao提供的所有库都是完全开源的.其中的多数库都可以 ...

  6. Android OpenGL ES 开发教程 从入门到精通

    感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...

  7. OpenGL + MFC

    OpenGL超级宝典(中文版) 2001年 本书是一本完整而详尽的关于OpenGL的参考书,全书分为四部分:第一部分“OpenGL导言”介绍3D图形学的基本原理,读者将在此学会构造使用OpenGL的程 ...

  8. OpenGL ES 简单教程

    什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. ...

  9. OpenGL 资源汇编

    本文收集和汇总了 OpenGL 的文档.教程和在线书籍,供学习和开发者參考. OPENGL开发教程:http://www.linuxgraphics.cn/opengl/index.html Open ...

随机推荐

  1. ReentrantLock 学习

    Java接口Lock有三个实现类:ReentrantLock.ReentrantReadWriteLock.ReadLock和ReentrantReadWriteLock.WriteLock.Lock ...

  2. section

    @RenderSection("Header")   @section Header { <div class="view"> @foreach ( ...

  3. 02 java 基础:java 文件名与类名关系 CLASSPATH

    java 类修饰符:通常情况下使用 public 修饰,此时,java 强制要求 .java 文件名需与该 public 修饰类名一致,否则无法编译通过.如若没有加修饰符,文件名与类名可无任何关联. ...

  4. CentOS7.5更改grub2菜单背景&开机动态画面

    Grub2菜单背景 红帽企业版 Linux 7 的引导装载程序是“GRUB 2”.您可以更改“GRUB 2”外观的几个部分.以下几小节将向您展示如何改变 Linux 发行版名称.菜单颜色,和背景图片. ...

  5. react native android 上传文件,Nodejs服务端获取上传的文件

    React Native端 使用react-native-image-picker 做出选择图片的操作,选择完成后,直接将图片Post至服务器,保存在服务器的某个地方(保存图片的路径需要公开显示),并 ...

  6. Codeforces gym102058 J. Rising Sun-简单的计算几何+二分 (2018-2019 XIX Open Cup, Grand Prix of Korea (Division 2))

    J. Rising Sun time limit per test 1.0 s memory limit per test 1024 MB input standard input output st ...

  7. 洛谷P3539 [POI2012] ROZ-Fibonacci Representation

    题目传送门 转载自:five20,转载请注明出处 本来看到这题,蒟蒻是真心没有把握的,还是five20大佬巨orz 首先由于斐波拉契数的前两项是1,1 ,所以易得对于任何整数必能写成多个斐波拉契数加减 ...

  8. 配置文件报错:元素类型 "XXX" 必须后跟属性规范 ">" 或 "/>"

    这是一个比较常见的配置错误,一般分两步. 有的情况的确是xml文件出现了语法问题,可以让IDE来帮我们检查xml文件是否真的出现了语法错误.把xml内容复制进IDE中,让IDE帮我们检查错误. 如上图 ...

  9. 使用screen后台实时执行命令

    在做一个大体积的数据备份时,在远程终端上直接运行备份脚本back.sh,或运行back.sh&放到后台运行,此时关闭远程终端,或网络断开都会让命令停止运行.此时就要使用到screen命令. s ...

  10. 第8天-setInterval/setTimeout

    setInterval是什么? setInterval()方法重复调用一个函数或执行一个代码段,在每次调用之间具有固定的时间延迟. setInterval(函数,间隔时间) 例如 function f ...