光照

来源:互联网 发布:淘宝视频直播间在那里 编辑:程序博客网 时间:2024/06/12 01:07

实现隐藏面消除的最好方法是使用深度缓冲区。深度缓冲区的原理就是把一个距离观察平面的深度值与窗口中的每个像素相关联。一开始,以GL_DEPTH_BUFFER_BIT为参数使用glClear()函数,把所有像素的深度值设置为最大可能的距离。随后,在场景中以任意顺序绘制所有的物体。硬件或软件所执行的图形计算把每个被绘制的表面转换为窗口上一些像素的集合,此时并不考虑他们是否会被其他物体所遮挡。此外,还要计算这些表面和观察平面的距离。如果启用了深度缓冲区,在绘制每个像素值钱,OpenGL就会把它的深度值与原先存储在深度缓冲区中的深度值进行比较。如果新像素比原先的像素更靠近观察平面,这个新像素的颜色和深度值就会取代原先被写入像素的值。如果新像素的深度值大于原先像素的深度值,新像素就被遮挡,它的颜色和深度值将被丢弃。为了使用深度缓冲区,需要启用它。只要启用一次就可以了。每次绘制场景时,需要在绘图之前清除深度缓冲区,然后以任意顺序绘制场景中的物体。

光源颜色的特征是由它所发射的红、绿和蓝光的数量决定的。表面材料的特征是由它从各个不同的方向所反射的入射红、绿、蓝光成分的百分比决定的。在OpenGL的光照模型中,只有当存在能够吸收和反射光线的表面时,光源才会产生效果。OpenGL假定每个表面是由一种具有某些属性的材料所组成的。除了环境、散射和镜面颜色之外,材料还可能具有一种发射颜色(emissive color),它模拟那些源自某个物体的光。在OpenGL光照模型中,表面的发射颜色可以增加物体的强度,但它不受任何光源的影响。另外,在整体场景中,发射颜色并没有被作为一种额外的光照。OpenGL光照模型根据材料所反射的红、绿和蓝光的比例来模拟它的颜色。

和光一样,材料也具有不同的环境、散射和镜面颜色,他们决定了这种材料的环境、散射和镜面的反射率。材料的环境反射属性与每种入射光源的环境光成分组合,散射反射属性与入射光的散射成分组合,镜面反射属性和入射光的镜面成分组合。环境和散射属性定义了材料的颜色,它们一般很相似,但并不相同。镜面反射属性通常是白色或灰色的,因此镜面亮点的颜色也就是光源的镜面光的颜色。如果一束白光照射一个有光泽的红色塑料球体,这个球体的整体看上去是红色的,但它上面的那些亮点则是白色的。

对于材料而言,它的RGB值和它对这些这些颜色的反射比例相对应。因此,如果一种材料的R=1,G=0.5,B=0,它将反射所有的入射红光,一半的入射绿光,但不反射任何入射蓝光。

原创粉丝点击