OpenGLut开发入门教程07:光照
系列教程索引:OpenGLut入门索引
光照就是灯光照射,在三维坐标系中某一个点放置一个灯光。
opengl三维世界坐标系为:
- OpenGL坐标系(物体、世界、照相机坐标系)属于右手坐标系
- 设备坐标系使用的是左手坐标系
我们之前开发的代码中一般z轴部分为负值,也就是说,我们看的视角是从z轴的+方向看向-方法,那么灯光应该放于z轴+方向某一点。这样灯光就会照射在位于负方向的我们绘制的图像上。
对于灯光来说,我们生活中一般是白色或者亮色的,但是OpenGL中并未指定灯光颜色,所以就是任意RGB值组合。
首先函数基本的架构是:
在main函数中glut*Func()的参数为回调函数,需要在main函数外独立实现。
重要的是四个回调函数:
- initGL,初始化函数
- reshapeGL,尺寸调整函数,当窗口的尺寸发生变化时调用此函数重新绘图
- keyboard,捕获键盘输入并处理
- displayGL,将想要显示的图像绘制出来的函数
其他函数说明见OpenGL函数功能说明系列。
加载纹理
1 |
|
流程上还是获取数据、创建纹理、绑定纹理、生成纹理。
设置灯光
在初始化函数中设置灯光的颜色、位置。
1 |
|
(1)GL_AMBIENT、GL_DIFFUSE、GL_SPECULAR属性。这三个属性与光源的三个对应属性类似,每一属性都由四个值组成。GL_AMBIENT表示各种光线照射到该材质上,经过很多次反射后最终遗留在环境中的光线强度(颜色)。GL_DIFFUSE表示光线照射到该材质上,经过漫反射后形成的光线强度(颜色)。GL_SPECULAR表示光线照射到该材质上,经过镜面反射后形成的光线强度(颜色)。通常,GL_AMBIENT和GL_DIFFUSE都取相同的值,可以达到比较真实的效果。使用GL_AMBIENT_AND_DIFFUSE可以同时设置GL_AMBIENT和GL_DIFFUSE属性。
(2)GL_SHININESS属性。该属性只有一个值,称为“镜面指数”,取值范围是0到128。该值越小,表示材质越粗糙,点光源发射的光线照射到上面,也可以产生较大的亮点。该值越大,表示材质越类似于镜面,光源照射到上面后,产生较小的亮点。
(3)GL_EMISSION属性。该属性由四个值组成,表示一种颜色。OpenGL认为该材质本身就微微的向外发射光线,以至于眼睛感觉到它有这样的颜色,但这光线又比较微弱,以至于不会影响到其它物体的颜色。
(4)GL_COLOR_INDEXES属性。该属性仅在颜色索引模式下使用,由于颜色索引模式下的光照比RGBA模式要复杂,并且使用范围较小,这里不做讨论。
绘制图像
1 |
|
绘图部分和之前的纹理绘图一样。
键盘捕获
1 |
|
要想捕获键盘输入,就得知道键盘输入是什么。
想要捕获什么就在keyboard函数中处理什么。
默认效果:
关闭灯光后
完整源码在OpenGL_Freshman下的GLUT的07.light中。