OPENGL固定图形渲染管线操作细节
本文结合OPENGL技术文档和程序实验探求在OPENGL中综合使用了 顶点颜色,光照(材质),纹理,片元混合 后的应该得到的绘制效果。
本文的可执行程序如下:
http://download1.csdn.net/down3/20070517/17205731333.rar
(一)颜色模式
OPENGL状态机保持一个当前RGBA颜色,除非应用程序指定使用一个更复杂的颜色模型,例如光照模型或是纹理映射模型,否则,绘制的任何一个物体都使用OPENGL状态机保持的这个当前RGBA颜色。
下图的绘制状态
|
颜色型指没有使用光照模型。 |
(二)光照模式
当使用OPENGL命令glEnable(GL_LIGHTING)后,OPENGL状态机的绘制模式转为使用光照模型:
(A). OPENGL光照模型中,场景的光线来自于不同的光源,光源的开关相互独立。OPENGL假定光源只对吸收或反射光线的表面产生影响。绘制场景时,OPENGL至少支持加入8个光源。
(B). 同时,每个表面都认为由不同属性的材质构成,材质可能将入射光散射到各个方向,可能将大部分光线反射到特定方向,材质本身也能产生光线。
只要当前的绘制是使用光照模型,那么材质属性就要被计算,材质是OPENGL状态机中的一组状态,五个参数:
(1). 环境颜色(GL_AMBIENT)默认值(0.2,0.2,0.2,1.0)
(2). 散射颜色(GL_DIFFUSE),默认值(0.8,0.8,0.8,1.0)
(3). 放射光颜色(GL_EMISSION),默认值(0.2,0.0,0.0,1.0)
(4). 镜面反射颜色(GL_SPECULAR),默认值(0.0,0.0,0.0,1.0)
(5). 镜面反射参数(GL_SHININESS)。默认值0.0,取值范围[0.0, 128.0]
使用函数glMaterial*()设置改变这五个参数。
不论其他参数的alpha值为多少,顶点alpha值就是材质散射颜色(GL_DIFFUSE)的alpha值。
物体的颜色很大程度上受散射光的影响,它取决于入射光的散射分量和入射光相对物体表面法线的角度(角度越小,散射光强越大),和视点无关。真实世界中的散射光和环境光通常是同样颜色。
(C). OPENGL光照模型将光照(光源和拥有材质属性的物体表面作用后的视觉效果)分成四个独立的成分:环境光效果(ambient)、散射光效果(diffuse)、镜面反射光效果(specula)和发射光效果(emission)。四种成分独立计算然后混合到一起。
(D). 光照模型有四个参数(和前面描述的光照的四个独立成分不是一回事):
(1).全局环境光强(GL_LIGHT_MODEL_AMBIENT),默认值是(0.2,0.2,0.2,1.0)。
(2).观察者位置模式(GL_LIGHT_LOCAL_VIEWER)(和计算镜面反射分量相关),默认值GL_FALSE,即观察者在无穷远处。
(3).单面光照or双面光照(GL_LIGHT_MODEL_TWO_SIDE),默认值GL_FALSE,单面光照。
(4).是否分离镜面颜色(GL_LIGHT_MODEL_COLOR_CONTROL)(和纹理映射效果相结合),默认值为GL_SINGLE_COLOR。
光照使用函数glLightModel*()指定光照模型的四个参数。
(E). 使用glEnable(GL_COLOR_MATERIAL),指明OPENGL状态机使用” 颜色材料模式”。在该模式下,使用glColorMaterial()可以指定材质的某一个材质材质参数根据当前绘制的面片的颜色而改变。
|
自定义材质: Ambient={ 0.75f , 0.4f , 0.4f , 0.5f } Difuse={ 0.75f , 0.4f , 0.4f , 0.5f } Specular={ 0.75f , 0.4f , 0.4f , 0.5f } Shiness=128 |