浅析OpenGL光照

之前从来都没有涉及光照的内容,心想只要能通过常规的方法渲染出几何体甚至是模型就可以了,然而没有光照的日子注定是苦涩的,因为仅凭几何体和模型的颜色无法达到真是渲染的效果,在实际中有各种各样的光影响着我们的视觉效果,而OpenGL能够为我们还原现实生活中的光照现象。所以,我还是下决心研究OpenGL的光照了!

    

    为了研究固定管线渲染中光照的部分,我使用Qt和OpenGL技术制作了一个小小的程序,它可以设置光源的各种属性,由此了解光照的原理。

    

    首先呢,在OpenGL中要使用光照,只需简单地添加一句:

    glEnable( GL_LIGHTING );

然后,如果需要添加某个光源,则需要这么写:

    glEnable( GL_LIGHT0 );

当然,在OpenGL固定渲染管线中最多可以添加八个光源,它们的编号分别是GL_LIGHT0到GL_LIGHT7。当然,可以设置每一个光的详细属性,像这样:

    glLightfv( 光源编号, 光源属性, 值 );
比如说glLightfv( GL_LIGHT0, GL_DIFFUSE, diffuse );

我写的演示程序包含有许许多多的属性,它们是:

它们其实是来自上述表:

Parameter Name

Default Value

Meaning

GL_AMBIENT

(0.0, 0.0, 0.0, 1.0)

ambient RGBA intensity of light

GL_DIFFUSE

(1.0, 1.0, 1.0, 1.0)

diffuse RGBA intensity of light

GL_SPECULAR

(1.0, 1.0, 1.0, 1.0)

specular RGBA intensity of light

GL_POSITION

(0.0, 0.0, 1.0, 0.0)

(x, y, z, w) position of light

GL_SPOT_DIRECTION

(0.0, 0.0, -1.0)

(x, y, z) direction of spotlight

GL_SPOT_EXPONENT

0.0

spotlight exponent

GL_SPOT_CUTOFF

180.0

spotlight cutoff angle

GL_CONSTANT_ATTENUATION

1.0

constant attenuation factor

GL_LINEAR_ATTENUATION

0.0

linear attenuation factor

GL_QUADRATIC_ATTENUATION

0.0

quadratic attenuation factor

通过设置这些属性以获得不同的结果。

1、环境光颜色改变的效果

2、漫反射颜色改变的效果

3、镜面反射颜色改变的效果

4、光源位置和光源方向改变的效果

5、光源衰减指数改变的效果

6、光源半切角改变的效果

7、光源常衰减指数改变的效果

8、光源线性衰减指数改变的效果

9、光源二次衰减指数改变的效果

此外,通过OpenGL设置全局环境光的函数来设置全局光。
glLightModelfv( GL_LIGHT_MODEL_AMBIENT, amb );
比如说在白天烈日暴晒,那么全局光可能就差不多是白色,而在晚上,全局光很微弱,可以近似为黑色。通过设置全局光来模拟场景中的光照基色。
比如下面两张图第一张是全局光RGB(75,75,75),而第二张则是RGB(215,215,215)。

有关颜色追踪
    OpenGL为了方便地设置材质的相关属性,推出了颜色追踪的功能。它可以省去诸多glMaterialf(v)函数的调用,直接用glColor类函数代表这些材质即可。比如说

    glEnable( GL_COLOR_MATERIAL );// 开启颜色追踪
glColorMaterial( GL_FRONT, GL_AMBIENT );// glColor在正面代表其环境材质
glColor3fv( ambient );// 设定其环境材质
glColorMaterial( GL_FRONT, GL_SPECULAR );// glColor在正面代表其镜面反射材质
glColor3fv( specular );// 设定其镜面反射材质
……

好了,有关OpenGL光照的研究也该告一段落了,我的演示程序中还有一些其它的功能,比如模型的渲染选项啊,还有设置背景颜色等等。大家都可以尝试体验一下。
    

    演示程序下载地址:
这里    程序源代码下载地址:这里

浅析OpenGL光照的更多相关文章

  1. OpenGL光照和颜色

    OpenGL光照和颜色 转自:http://www.cnblogs.com/kekec/archive/2011/08/16/2140789.html OpenGL场景中模型颜色的产生,大致为如下的流 ...

  2. OpenGL光照测试

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

  3. OpenGL光照3:光源

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

  4. 【狼】openGL 光照的学习

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

  5. OpenGL光照设置

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

  6. 实验7 OpenGL光照

    一.实验目的: 了解掌握OpenGL程序的光照与材质,能正确使用光源与材质函数设置所需的绘制效果. 二.实验内容: (1)下载并运行Nate Robin教学程序包中的lightmaterial程序,试 ...

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

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

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

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

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

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

随机推荐

  1. PHP实现菜单无限极分类

    菜单数据 这里我们的菜单数据是临时数据, 没有从数据库中查询处理,数据基本和数据库中的的相似. 数据如下: $items = array( 1 => array('id' => 1, 'p ...

  2. java 局部内部类

    可以在代码块里创建内部类,典型的方法是在一个方法体的里面创建,局部内部类不能有访问说明符,因为它不是外围类的一部分,但是可以访问当前代码块的常量,以及此外围类的所有成员,下面分别对局部内部类和匿名内部 ...

  3. Unix IPC之Posix消息队列(2)

    /* Query status and attributes of message queue MQDES. */ extern int mq_getattr (mqd_t __mqdes, stru ...

  4. select into的缺点

    当使用到select  *  into 表A  from 表 B时可以复制表的结构和数据,但是千万不要忘了给新表A添加主键和索引, 因为在使用select  into 时不会复制索引和主键,因此,当我 ...

  5. MySQL学习笔记:upper、lower、ucase、lacase——字符串函数

    在MySQL中,通过利用upper.lower.ucase.lacase几个函数对字符串进行大小写转换. upper(str)——根据当前字符集映射返回字符串str,并将所有字符更改为大写.默认值是l ...

  6. IE6 验证码刷新失败显示空白解决办法

    原因:点击a标签看不清?换图片 结果验证码显示的空白! 解决办法:在对应的点击事件最后加上return false 即可解决问题. 下面是HTML源码: <p class="regis ...

  7. Dubbo内核实现之SPI简单介绍

    这个部分单独写一页,看起来更高大上一些. 1.概括 Dubbo采用微内核+插件体系,使得设计优雅,扩展性强.那所谓的微内核+插件体系是如何实现的呢! 即我们定义了服务接口标准,让厂商去实现(如果不了解 ...

  8. ECSHOP的JS文件代入问题

    参考一下默认的js写法就行了<script type='text/javascript' src='themes/ecmoban/js/jquery-1.7.2.min.js'></ ...

  9. centos6 yum 安装nginx 不成功解决办法

    转自  http://wlheihei.com/view/64 [root@51ou.com yum.repos.d]# yum install nginxLoaded plugins: fastes ...

  10. Ninject

    一.为什么要使用依赖注入框架 依赖注入框架也叫IoC容器.它的作用使类与类之间解耦 我们看看为什么要用依赖注入框架,举个几个梨子: 1,高度耦合的类 有一个Order类,Order类是用于订单操作的, ...