OpenGL光照和颜色
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.0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); |
-- 点光源 -- 有位置没有方向
|
1
2
|
GLfloat lightPosition[] = {8.5, 5.0, -2.0, 1.0}; // w不为0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); |
-- 聚光灯 -- 有位置有方向

|
1
2
3
4
5
|
GLfloat lightPosition[] = {-6.0, 1.0, 3.0, 1.0}; // w不为0glLightfv(GL_LIGHT0, GL_POSITION, lightPosition);GLfloat lightDirection[] = {1.0, 1.0, 0.0};glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, lightDirection); // 聚光灯主轴方向 spot directionglLightf(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光照和颜色的更多相关文章
- OpenGL光照1:颜色和基础光照
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- OpenGL光照设置
一.设置光源 (1)光源的种类 环境光 环境光是一种无处不在的光.环境光源放出的光线被认为来自任何方向.因此,当你仅为场景指定环境光时,所有的物体无论法向量如何,都将表现为同样的明暗程度. 点光源 由 ...
- 浅析OpenGL光照
浅析OpenGL光照 之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有 ...
- OpenGL光照3:光源
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- OpenGL光照测试
OpenGL光照测试 花了大概半个月,研究了OpenGL的光照.请注意是固定管线渲染的光照,如果使用着色器的高手们请飘过.这个程序是通过光照对模型的照射,来研究OpenGL光照的性质.以后可以通过这个 ...
- 【狼】openGL 光照的学习
小狼学习原创,欢迎批评指正 http://www.cnblogs.com/zhanlang96/p/3859439.html 先上代码 #include "stdafx.h" #i ...
- OpenGL光照2:材质和光照贴图
本文是个人学习记录,学习建议看教程 https://learnopengl-cn.github.io/ 非常感谢原作者JoeyDeVries和多为中文翻译者提供的优质教程 的内容为插入注释,可以先跳过 ...
- 第07课 OpenGL 光照和键盘(1)
光照和键盘控制: 在这一课里,我们将添加光照和键盘控制,它让程序看起来更美观. 这一课我会教您如何使用三种不同的纹理滤波方式.教您如何使用键盘来移动场景中的对象,还会教您在OpenGL场景中应用简单的 ...
- OpenGL图元的颜色属性
OpenGL支持两种颜色模式:一种是RGBA,一种是颜色索引模式. 1. RGBA颜色RGBA模式中,每一个像素会保存以下数据:R值(红色分量).G值(绿色分量).B值(蓝色分量)和A值(alpha分 ...
随机推荐
- Java 判断整数方法
今天写代码的时候突然想到要怎么来判断整数,然后通过判断是否是整数来处理相关的操作.开始想到了几个方法,比如百度到的 x(int) instanceof Integer,但是这样的话程序会报错,还有一个 ...
- LPC1768/1769之CAN控制器概述(附库函数下载地址)
一.背景: 使用LPC1769来做CAN的收发,在此对使用LPC1769的CAN控制器进行收发做个总结和记录,以备下 次开发快速上手使用. 附:LPC1768/1769除了支持最高频率不同以外,其它基 ...
- 巧用dimens适配多个分辨率
让应用自动适配多个分辨率的屏幕,是每个android程序员的基本功,就好像前端工程师熟练编写CSS Hack一样.适配工作中一个重要的工作就是对页面的调整. 对于页面的适配,有很多的方法和技巧.比 ...
- C#高级编程笔记 Day 8, 2016年9月 28日 (数组)
1.数组的初始化 声明了数组后,就必须为数组分配内存,以保存数组的所有元素.数组是引用类型,所以必须给它分配堆上的内存,为此,应使用 new 运算符,指定数组中元素的类型和数量来初始化数组的变量.若使 ...
- linux 配置ssh免密码登陆本机
1.安装 sudo apt-get install ssh 2.配置无密码登录 ssh-keygen -t rsa 遇到停顿按回车即可 进入/home/zeze/.ssh目录(隐藏目录,在winSCP ...
- 下拉列表 select-option ; select-optgroup-option
HTML中的下拉列表: <select> <option value ="1">Volvo</option> <option value ...
- jquery手写实现单页滚动导航
效果说明:点击tab导航,页面滑动到下方相应板块.并且当页面通过鼠标滚动下去时,上方的tab也可以自动切换到当前位置的板块上. 代码说明:js中对两个动作分别写,一个是tab点击下滑到相应板块位置:一 ...
- Java批量文件打包下载
经常遇到选择多个文件进行批量下载的情况,可以先将选择的所有的文件生成一个zip文件,然后再下载,该zip文件,即可实现批量下载,但是在打包过程中,常常也会出现下载过来的zip文件中里面有乱码的文件名, ...
- C#与Java多态方面的语法差异
C++.C#.Java,无奈三种语言让我多次混淆,多次搞清楚,不写个Demo我想还是会忘记的. 就好像是一个满水的杯子,倒掉一点,才能装下更多. 有时候博客就是一个倒水的地方,可以让我们清空自己,然后 ...
- .NET 程序集与命名空间
程序集 程序集(assembly)是一个或多个托管模块,以及一些资源文件的逻辑组合. 组成部分 Windows文件首部 CLR文件首部 程序集清单 类型元数据 MSIL(CIL)代码 嵌入资源集 作用 ...