浅析OpenGL光照

时间:2023-03-08 16:26:17
浅析OpenGL光照

浅析OpenGL光照

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

    

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

    

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

    glEnable( GL_LIGHTING );

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

    glEnable( GL_LIGHT0 );

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

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

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

浅析OpenGL光照

它们其实是来自上述表:

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、环境光颜色改变的效果

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

浅析OpenGL光照

浅析OpenGL光照

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

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