OpenGL光照和颜色

转自:http://www.cnblogs.com/kekec/archive/2011/08/16/2140789.html

OpenGL场景中模型颜色的产生,大致为如下的流程图所描述:++

++++++  ++++++  ++++++  ++++++

(1)当不开启光照时,使用顶点颜色来产生整个表面的颜色。

glShadeModel可以设置表面内部像素颜色产生的方式。GL_FLAT/GL_SMOOTH.

++

(2)一般而言,开启光照后,在场景中至少需要有一个光源(GL_LIGHT0...GL_LIGHT7)

通过glEnable(GL_LIGHT0)  glDisable(GL_LIGHT0) 来开启和关闭指定的光源。

GLfloat gAmbient[] = {0.6, ,, ,, 1.0};
glLightModelfv(GL_LIGHT_MODEL_AMBIENT, gAmbient);

全局环境光

++

(3)设置光源的光分量  -- 环境光/漫色光/镜面光

默认情况下,GL_LIGHT0...GL_LIGHT7 的GL_AMBIENT值为(0.0, 0.0, 0.0, 1.0);

GL_LIGHT0的GL_DIFFUSE和GL_SPECULAR值为(1.0, 1.0, 1.0, 1.0),

GL_LIGHT1...GL_LIGHT7 的GL_DIFFUSE和GL_SPECULAR值为(0.0, 0.0, 0.0, 0.0)。

GLfloat lightAmbient[] = {1.0, 1.0, 1.0, 1.0};
GLfloat lightDiffuse[] = {1.0, 1.0, 1.0, 1.0};
GLfloat lightSpecular[] = {0.5, 0.5, 0.5, 1.0};
glLightfv(GL_LIGHT0, GL_AMBIENT, lightAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, lightDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, lightSpecular);

++

(4)设置光源的位置和方向

-- 平行光 --         没有位置只有方向

1
2
GLfloat lightPosition[] = {8.5, 5.0, -2.0, 0.0};   // w=0.0
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

-- 点光源 --          有位置没有方向

1
2
GLfloat lightPosition[] = {8.5, 5.0, -2.0, 1.0};   // w不为0
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);

-- 聚光灯 --          有位置有方向

1
2
3
4
5
GLfloat lightPosition[] = {-6.0, 1.0, 3.0, 1.0};   // w不为0
glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);
GLfloat lightDirection[] = {1.0, 1.0, 0.0};
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection);  // 聚光灯主轴方向  spot direction
glLightf(GL_LIGHT0, GL_SPOT_CUTOFF, 45.0);   // cutoff角度  spot cutoff

** 平行光不会随着距离d增加而衰减,但点光源和聚光灯会发生衰减。

attenuation为衰变系数,系数值越大,衰变越快。

默认情况下,c=1.0, l=0.0, q=0.0

           

1
2
3
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 2.0);     // c 系数
glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 1.0);        // l 系数
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.5);    // q 系数

++

(5)设置材质属性

环境光、散射光不受视点位置的影响。物体看起来是什么颜色,很大程度上地受到散射光的影响,环境光反射也对物体的颜色有一定的影响。

因为当光直射物体时,散射光最强;非直射时,环境光效果明显。对于真实的世界中的物体,其散射光与环境光通常是同一个颜色。

物体的镜面反射会在物体表面产生一个高亮区。观察者所看到的镜面反射依赖于视点位置 -- 沿着反射光的方向亮度最高。

默认情况下,材质的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_SHININESS值为0.0【取值范围为[0.0, 128.0],数值越大,高亮区越小,亮度越高】;

GL_GL_EMISSION值为(0.0, 0.0, 0.0, 1.0)

1
2
3
4
5
6
7
8
9
10
11
12
GLfloat matAmbient[] = {0.6, 0.6, 0.6, 1.0};
GLfloat matDiffuse[]   = {0.35, 0.35, 0.35, 1.0};
GLfloat matAmbDif[]   = {0.5, 0.5, 0.5, 1.0};
GLfloat matSpecular[] = {0.2, 0.2, 0.2, 1.0};
GLfloat shine[] = {5.0};
GLfloat matEmission[] = {0.3, 0.1, 0.1, 1.0};
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, matAmbient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, matDiffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, matAmbDif);  // 将背景颜色和散射颜色设置成同一颜色
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, matSpecular);
glMaterialfv(GL_FRONT, GL_SHININESS, shine);
glMaterialfv(GL_FRONT, GL_EMISSION, matEmission);  // 用来模拟物体发光的效果,但这不是光源

++

(6)颜色材质模式

使用颜色材质可以用较小的代价,快速改变场景中模型的颜色。其具体用法如下:

1
2
3
4
5
6
7
8
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT, GL_DIFFUSE);
glColor3f(0.2, 0.5, 0.8);
/*** 绘制一些物体 ***/
glColorMaterial(GL_FRONT, GL_SPECULAR);
glColor3f(0.9, 0.1, 0.3);
/*** 绘制另外一些物体 ***/
glDisable(GL_COLOR_MATERIAL);

++

(7)参考

http://fly.cc.fer.hr/~unreal/theredbook/

http://www.john-chapman.net/content.php?id=3

http://www.sjbaker.org/steve/omniv/opengl_lighting.html

http://blog.csdn.net/gamesdev/article/details/9796715

OpenGL光照和颜色的更多相关文章

  1. OpenGL光照1:颜色和基础光照

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  2. OpenGL光照设置

    一.设置光源 (1)光源的种类 环境光 环境光是一种无处不在的光.环境光源放出的光线被认为来自任何方向.因此,当你仅为场景指定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度. 点光源 由 ...

  3. 浅析OpenGL光照

    浅析OpenGL光照 之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有 ...

  4. OpenGL光照3:光源

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  5. OpenGL光照测试

    OpenGL光照测试 花了大概半个月,研究了OpenGL的光照.请注意是固定管线渲染的光照,如果使用着色器的高手们请飘过.这个程序是通过光照对模型的照射,来研究OpenGL光照的性质.以后可以通过这个 ...

  6. 【狼】openGL 光照的学习

    小狼学习原创,欢迎批评指正 http://www.cnblogs.com/zhanlang96/p/3859439.html 先上代码 #include "stdafx.h" #i ...

  7. OpenGL光照2:材质和光照贴图

    本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...

  8. 第07课 OpenGL 光照和键盘(1)

    光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...

  9. OpenGL图元的颜色属性

    OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 1. RGBA颜色RGBA模式中,每一个像素会保存以下数据:R值(红色分量).G值(绿色分量).B值(蓝色分量)和A值(alpha分 ...

随机推荐

  1. php判断str是否是xml格式

    function xml_parser($str){ $xml_parser = xml_parser_create(); if(!xml_parse($xml_parser,$str,true)){ ...

  2. 5、Servlet的使用

    一.什么是Servlet:用于开发动态Web资源的的技术.使用Servlet可以读取来自用户端的数据,而实现了用户与服务器之间的动态数据交互.更简单的说就是连接页面和代码. 1.开发一个动态的Web资 ...

  3. PHP realpath() 函数

    定义和用法 realpath() 函数返回绝对路径. 该函数删除所有符号连接(比如 '/./', '/../' 以及多余的 '/'),返回绝对路径名. 若失败,则返回 false.比如说文件不存在的话 ...

  4. vue 列表渲染

    在Vue官网中写道,vue无法直接用索引设置元素, 如 vm.items[0] = {}: 提出的解决方法是用 : example1.items.$set(0, { childMsg: 'Change ...

  5. JDK source 之 LinkedHashMap原理浅谈

    注:本文参考JDK1.7.0_45源码. LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的 ...

  6. alert 替代效果smoke.js

    在一些表单等需要弹窗提醒的时候,每个浏览器都有一个alert(),comfirm()函数能弹出信息,但是浏览器的自带的这种效果样式不统一,而且都固定在页面顶部: smoke.js轻量级的JS插件,他标 ...

  7. 关于oracle中日期使用

    spl> select * from emp         where dates          between         to_date('2007-06-12 10:00:00' ...

  8. PHP PHPUnit的简单使用

    1.window安装pear的教程:http://jingyan.baidu.com/article/ca41422fd8cf3d1eae99ed3e.html 2.在工作目录下,放两个文件: 1)C ...

  9. linux启动和关闭

    startup,startup mount,startup nomount之间的区别: STARTUP NOMOUNT选项:(读初始化参数文件,启动实例)STARTUP NOMOUNT选项启动实例,但 ...

  10. python之常用内置函数

    python内置函数,可以通过python的帮助文档 Build-in Functions,在终端交互下可以通过命令查看 >>> dir("__builtins__&quo ...