MinLu的个人博客分享 http://blog.sciencenet.cn/u/MinLu

博文

OpenGL(三)关于OpenGL中的光照问题

已有 9428 次阅读 2011-11-17 17:36 |个人分类:每天进步一点点|系统分类:科研笔记| OpenGL学习

在使用OpengGL中的光照功能时,注意要开启隐藏表面消除功能,所谓隐藏表面消除功能指消除实心物体被其他物体所遮挡的部分。深度缓冲区测试是实现这一功能的方法之一(最简单),通过比较新像素深度(离视平面的距离)与当前像素深度,将二者中距离较小者颜色设为该点像素颜色。因此,在实现隐藏面消除功能时,要开启深度缓冲区测试功能,即glEnable(GL_DEPTH_TEST),在重绘场景时,使用glClear()不仅重置了颜色缓冲区,也重置了深度缓冲区。
OpenGL通过环境光(Ambient Light)、散射光(Diffuse Light)、镜面反射光(Specular Light)以及发射光(Emissive Light)来模拟逼真的光照效果,前三种光属于光源属性,通过glLightfv()函数的GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR来设置光颜色,而最后一种光属于物体的材料属性,通过glMaterialfv()函数的GL_EMMISION来设置。
三维场景中最终的光照效果取决于对光源、物体的材料属性以及光照模型的定义
光源的定义
如前介绍的,glLightfv()函数,除了用来定义特定的光源的颜色属性,还可以定义诸如光源位置,衰减因子等属性。
根据光源位置的不同,可以将光源分为方向性光源与位置性光源两种:方向性光源是假设光源距离物体无穷远,所有到达物体的光线都是平行的,通过定义方向性光源在局部坐标系中的位置,来确定光的方向,作用于物体,简单地说,方向性光源为平行光;位置性光源通过指定光源位置,通过光源与物体之间的位置关系,来决定光线的效果,位置性光源为点光源。在编程时,通过一维数组的第四元素是否为0来确定是否是平行光源。
物体的材料属性的定义
通过glMaterial()函数,除了用来定义发射光属性外,还可以定义例如物体的散射、环境反射、镜面反射等属性。
光照模型的定义
通过glLightModel()函数可以定义诸如全局环境光、观察点位置等光照模型。
理解上,假如一条光线的颜色成分为(LR, LG, LB), 物体表面的材料颜色成分为(MR, MG, MB), 在不考虑其他反射效果时,最终进入眼睛的光应该是(LR * MR, LG * MG, LB * MB)。
其中,在定义全局光照和局部光照时,注意是在视图模型变换之前还是之后。如果是之前,那么光源位置的定义就应该是固定的;如果是之后,那么光源位置的定义就应该与接下来所要绘制的物体,是在同一个局部坐标系内,也可以理解成光源与物体是相对静止的。
关于定义物质的材料,在绘制不同物质前,都可以通过调用glMaterial()函数来分别设置从而达到不同物体不同材料属性的目的。





https://blog.sciencenet.cn/blog-655085-509052.html

上一篇:OpenGL(二)关于OpenGL中的色彩问题
下一篇:OpenGL(四)关于Opengl中的混合&显示列表问题
收藏 IP: 124.205.77.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-20 08:46

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部