RGBA HSB opengl光照模型
1. 几个概念
- 环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失.
- 全局环境光——它们并非来自特定的光源,这些光经过了多次散射,已经无法确定其光源位于何处.
- 散射光——来自同一方向,照射到物体表面后,将沿各个方向均匀反射,因此,无论从哪个方向观察,表面的亮度都相同.
- 镜面反射光——来自特定方向,也被反射到特定方向.镜面反射度与之相关.
- 材质发射光——用于模拟发光物体.在OpenGL光照模型中,表面的发射光增加了物体的亮度,它不受光源的影响,另外,发射光不会给整个场景中增加光线.
- OpenGL在模拟光源时,假定将发射出的光分解为R,G,B三个分量,这样,对于每个光源,可以使用其发射的红光,绿光和蓝光的量来描述;而对于表面的材质,可以使用其在各个方向反射的红光,绿光和蓝光的比例来描述.
- 光源只对吸收或者反射光线的表面产生影响,每个面都由具有各种属性的材质组成,材质本身可能发射光(如汽车前灯),沿所有方向散射入射光(一般情况)或者沿特定方向反射入射光(如镜面和其它光滑表面).
- 材 质的环境色,散射色和镜面反射色,它们决定了材质对环境光,散射光和镜面反射光的反射率.将材质的环境光反射率与每个光源的环境光分量相乘;将散射光反射 率与散射光分量相乘;将镜面反射光反射率与镜面反射光相乘.材质对环境光和散射光的反射率决定了其颜色,而这两种反射率往往是相等的,材质的镜面反射色通 常是白色或灰色(即(1.0,1.0,1.0)),因此镜面反射点的颜色一般为光源中镜面反射光的颜色.
- OpenGL光照模型将光照分为四个独立的部分:环境光,散射光,镜面反射光和发射光,这四种光被分别计算,然后叠加起来.
- 光线的R,G,B值表示各分量的强度,材质的R,G,B值表示材质对相应分量的反射比例.
- 定向光源不存在三种光线的衰减,但是定位光源存在衰减.
- 被照射的物体不会向其它物体发出光线.
- 为物体的每个顶点定义法线向量,这些法向量决定了物体相对于光源的朝向.
- 创建和选择一个或多个光源,并设置光源的位置.
- 创建和选择光照模型,它定义了全局环境光的等级和观察点的实际位置(用于光照计算).
- 启用光照.
- 设置场景中物体的材质属性.
- 为顶点指定法向量:glNormal3fv(n0);glVertex3fv(v0);
- 创建光源,指定位置:
glLightfv(GL_LIGHT0,GL_POSITION,light_position);
glLightfv(GL_LIGHT0,GL_AMBIENT,light_ambient);注意,GL_POSITION的默认值为(0,0,1,0),它定义了一个指向Z轴负方向的定向光源. - 选择光照模型:其包括四项内容,即全局环境光强度,观察点靠近场景还是位于无穷远处,对物体的正面和背面是否采用相同的光照计算,以及是否将镜面反射颜色同环境颜色和散射颜色分开,并在纹理操作后应用它.函数有
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER,lmodel_viewer)……,其中近视点还是远视点只影
响镜面反射区的计算. - 启用光照:glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);
- 设置材质属性:
用glMaterialfv(GLenum face, GLenum pname, Type* param)函数设置GL_AMBIENT,
GL_DIFFUSE, GL_AMBIENT_AND_DIFFUSE, GL_SPECULAR, GL_SHINNESS,
GL_EMISSION等值.
- 光源的环境光默认为(0.0,0.0,0.0,1.0),即没有环境光.
- 光源的散射光默认为(1.0,1.0,1.0,1.0),即存在白色散射光.
- 光
源的环境反射光默认值有两种情况,一种对应于光源GL_LIGNT0,其GL_SPECULAR为(1.0,1.0,1.0,1.0),即白色光;另一种
对应于其它光源,其默认值为(0.0,0.0,0.0,0.0).一般情况下,光源的GL_SPECULAR应该和GL_DIFFUSE值相同. - 默认情况下,定位光源向所有方向发射光,但可以将其设置为聚光灯,使之在锥体内发光.
- 光
照模型中,全局环境光默认为(0.2,0.2,0.2,1.0),即存在微弱的白光;视点位置默认为0.0或者GL_FALSE,即无穷远处;默认采用单
面光照,即GL_LIGHT_MODEL_TWO_SIDE为0.0或GL_FALSE(在对物体存在切割时,要启用双面光照);默认情况下,镜面反射颜
色在纹理映射之前完成,即GL_LIGHT_MODEL_COLOR_CONTROL的值为GL_SINGLE_COLOR. - 材
质属性的默认值:GL_AMBIENT (0.2,0.2,0.2,1.0); GL_DIFFUSE (0.8,0.8,0.8,1.0);
GL_SPECULAR (0.0,0.0,0.0,1.0); GL_SHINNESS 0.0; GL_EMISSION
(0.0,0.0,0.0,1.0).
- 顶点被照射时的颜色: 顶点颜色=顶点的发射光颜色 +
全局环境光与材质的环境光属性 +
各光源中衰减后的环境光,散射光和镜面反射光
执行光照计算后,颜色值(RGBA模式)被截取到[0.0,1.0]. - 顶点的发射光颜色即glMaterialfv()中的GL_EMISSION值.
- 反射的全局环境光 = glLightModelfv()指定的GL_AMBIENT * glMaterialfv()指定的GL_AMBIENT值.
- 光源的贡献 = 衰减因子 * 聚光效果 * (环境光 + 散射光 + 镜面反射光);其中,环境光 = glLightfv()指定的GL_AMBIENT * glMaterialfv()指定的GL_AMBIENT;
散射光的计算需要考虑光线的照射角度,光源散射分量和材质的散射属性:
散射光 =
(max{L dotproduct n,0} * light_diffuse * material_diffuse),L为顶点到光源的 单位矢量,n为顶点的单位法线向量.
镜面反射光项也取决于光线的照射角度.若(L dotproduct n)<=0;顶点将没有镜面反射光项,否 则镜面反射光取决于下列因素:
1) 顶点的单位法向量n.
2) 从顶点指向光源的单位矢量和从顶点指向视点的单位向量的和,此处假设光照模型中采用近视点, 否则第二个被加的单位向量为(0,0,1);然后将相加得到的向量归一化,记为s.
3) 镜面反射指数(glLightfv()指定的GL_SHINNESS).
4) 光源的镜面反射光分量(glLightfv()指定的GL_SPECULAR,一般和其GL_DIFFUSE相同).
5) 材质的镜面反射属性(glMaterialfv()指定的GL_SPECULAR).
计算公式:(max{s dotproduct n,0})^shinness * light_specular * material_specular.
- 顶
- 0
- 踩
- 0
RGBA HSB opengl光照模型的更多相关文章
- RenderMonkey 练习 第二天 【opengl 光照模型】
光照模型 3D渲染中, 物体表面的光照计算公式为: I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular); 其中,环境光(ambient)计算公式为 ...
- 【转】OpenGL基础图形编程(二)
原文:http://blog.chinaunix.net/uid-20638550-id-1909184.html 分类: 十一.位图与图像 11.1.位图 11.1.1 位图(Bitmap)与字符 ...
- OpenGL ES 简单教程
什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本号OpenGL 的一个子集. ...
- 3D OpenGL ES
什么是OpenGL ES? OpenGL ES (为OpenGL for Embedded System的缩写) 为适用于嵌入式系统的一个免费二维和三维图形库. 为桌面版本OpenGL 的一个子集. ...
- Android OpenGL ES 开发教程 从入门到精通
感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...
- openGL光源概念
1. 光照模型 环境光——经过多次反射而来的光称为环境光,无法确定其最初的方向,但当特定的光源关闭后,它们将消失. 全局环境光——每个光源都能对场景提供环境光.此外,还有一个环境光,它不来自 ...
- OpenGL 资源汇编
本文收集和汇总了 OpenGL 的文档.教程和在线书籍,供学习和开发者參考. OPENGL开发教程:http://www.linuxgraphics.cn/opengl/index.html Open ...
- Glidar: 一个基于OpenGL的开源实时3D传感器仿真器
1 简介 这篇博文将介绍一个简单易用的3D传感器仿真器,可以用来模拟Lidars,立体视觉,基于时间飞行技术的ToF相机和微软的Kinect实时产生3D点云数据.Glidar仿真器并不是针对特定的某一 ...
- golang.org/x/mobile/exp/gl/glutil/glimage.go 源码分析
看这篇之前,建议先看之前几篇,这几篇是基础. Go Mobile 例子 basic 源码分析 http://www.cnblogs.com/ghj1976/p/5183199.html OpenGL ...
随机推荐
- linux -- 进程的查看、进程id的获取、进程的杀死
进程查看 ps ax : 显示当前系统进程的列表 ps aux : 显示当前系统进程详细列表以及进程用户 ps ax|less : 如果输出过长,可能添加管道命令 less查看具体进程, 如:ps a ...
- CentOS 7在桌面添加快捷方式
直接把 /usr/share/applications 对应的 xxx.desktop 文件复制到桌面就OK!比如要在桌面创建Google Chrome Browser的快捷方式,直接在找到 /usr ...
- C++ 获取当前时间
#include <time.h> #include <stdio.h> int main( void ) { time_t t = time(0); char ...
- [转]查看处于被锁状态的表:v$locked_object dba_objects v$session all_objects v$sqlarea v$lock
oracle官网当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞.需要等另一个会话结束之后才可继续执行.可以通过发出 ...
- Systemd on ubuntu
何为 systemd? systemd 是一个 Linux 下的系统和会话管理器,与 SysV 和 LSB 启动脚本兼容.systemd 提供了积极的并行处理能力,使用套接字(socket)和 D-b ...
- IM软件业务知识—导航
----------------------------------------------------欢迎查看IM软件业务知识<专栏>-------------------------- ...
- 浅析Linux内核同步机制
非常早之前就接触过同步这个概念了,可是一直都非常模糊.没有深入地学习了解过,最近有时间了,就花时间研习了一下<linux内核标准教程>和<深入linux设备驱动程序内核机制>这 ...
- 工作流JBPM_day01:4-管理流程定义
工作流JBPM_day01:4-管理流程定义 管理流程(流程定义) 部署(添加) 查询 删除 查看流程图(xxx.png) -- 修改 --> 没有真正的修改,而是使用“再次部署+使用最新版本启 ...
- HTML的框架结构
<html> <head> <title>HTML的框架结构</title> </head> <frameset frameborde ...
- swift学习笔记之—自定义函数的规则说明
原文出自:www.hangge.com 转载请保留原文链接:http://www.hangge.com/blog/cache/detail_517.html 1,无返回值的函数 func test( ...