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

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光照模型的更多相关文章

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

    光照模型 3D渲染中, 物体表面的光照计算公式为: I = 环境光(Iambient) + 漫反射光(Idiffuse) + 镜面高光(Ispecular); 其中,环境光(ambient)计算公式为 ...

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

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

  3. OpenGL ES 简单教程

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

  4. 3D OpenGL ES

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

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

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

  6. openGL光源概念

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

  7. OpenGL 资源汇编

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

  8. Glidar: 一个基于OpenGL的开源实时3D传感器仿真器

    1 简介 这篇博文将介绍一个简单易用的3D传感器仿真器,可以用来模拟Lidars,立体视觉,基于时间飞行技术的ToF相机和微软的Kinect实时产生3D点云数据.Glidar仿真器并不是针对特定的某一 ...

  9. golang.org/x/mobile/exp/gl/glutil/glimage.go 源码分析

    看这篇之前,建议先看之前几篇,这几篇是基础. Go Mobile 例子 basic 源码分析 http://www.cnblogs.com/ghj1976/p/5183199.html OpenGL ...

随机推荐

  1. js实现密码强度

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 浮点纹理 opengl

    原文地址:http://wangqingyun84.blog.163.com/blog/static/790836172010323113604/ 因为 glsl部分 绑定fbo 看到要用浮点纹理,搜 ...

  3. C#一个关于委托和事件通俗易懂的例子

    using System; namespace Test { public class 室友 { public delegate void 这是一个委托(); public void 起床晨跑去() ...

  4. linux系统中,tee命令的使用

    需求描述: 今天在看nginx内容的过程,遇到了tee这个命令,所以查询了下,在这里记录下使用方法. 操作过程: 1.执行以下的命令 [root@testvm ~]# uname -n | tee h ...

  5. [hibernate]org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type setter

    org.hibernate.PropertyAccessException: Null value was assigned to a property of primitive type sette ...

  6. Java输入输出流(2)

    6. Java.IO流类库 1. io流的四个基本类 java.io包中包括了流式I/O所须要的全部类. 在java.io包中有四个基本类:InputStream.OutputStream及Reade ...

  7. 关于微信的jsdk的若干亲身实践之小结

    前言: 业务来源:自主研发的手机app软件有分享文章到微信或者QQ以及微博的功能,而在微信中再次点击分享按钮的时候,情况就出现的不可把控了: 文章显示的缩略图不能正常显示:文章的简介不能显示……而我们 ...

  8. cocos2d-x游戏引擎核心之三——主循环和定时器

    一.游戏主循环 在介绍游戏基本概念的时候,我们曾介绍了场景.层.精灵等游戏元素,但我们却故意避开了另一个同样重要的概念,那就是游戏主循环,这是因为 Cocos2d 已经为我们隐藏了游戏主循环的实现.读 ...

  9. JS中保留小数位数

    一.1.2.toFixed(2)

  10. 【Redis】php+redis实现消息队列

    在项目中使用消息队列一般是有如下几个原因: 把瞬间服务器的请求处理换成异步处理,缓解服务器的压力 实现数据顺序排列获取 redis实现消息队列步骤如下: 1).redis函数rpush,lpop 2) ...