在一般状态下,当把一个纹理应用于一个片断时,只有主颜色与纹理单元的颜色进行了组合.主颜色可能是光照计算的结果,也可能是通过glColor*()函数指定的值.
在纹理处理之后,但在进行雾计算之前,可以对片断应用一种辅助颜色.辅助颜色的应用可以使经过纹理贴图的物体具有更真实的高光效果.
---禁用光照时
如果当前并没有启用光照,并且启用了颜色求和模式(使用glEnable(GL_COLOR_SUM)),那么当前的辅助颜色(由glSecondaryColor*()所设置)便被加到经过纹理处理后的片断颜色上.
---启用光照后
纹理操作是在光照之后进行的,但把镜面亮点和纹理的颜色进行混合通常会减弱光照的效果. 可以为每个顶点计算两种颜色:一种是主颜色,由所有的非镜面成分组成,另一种是辅助颜色,由所有的镜面成分组成.如果把镜面颜色分离来,辅助(镜面)颜色就会在纹理计算之后再添加到片断中.
如果当前启用了光照,就会应用辅助镜面颜色,而不管是否为GL_COLOR_SUM模式,并且glSecondaryColor*所设置的任何辅助颜色都会被忽略.
---------------------
分离镜面成分
glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL, GL_SEPARATE_SPECULAR_COLOR);//后面参数用GL_SINGLE_COLOR恢复默认值
_____________
问题补充:
发射光在材料属性里设置
通过为GL_EMISSION参数指定一个RGBA颜色值,可以使物体看上去发射出这种颜色的光.
由于绝大多数现实世界的物体(除了光源之外)自己都不会发光,因此我们很可能只有在模拟场景中的台灯和其他光源时才会使用这个特性.
GLfloat mat_emission[]={0.3, 0.2, 0.2, 0.0};
glMaterialfv(GL_FRONT, GL_EMISSION, mat_emission);
虽然看上去微微有些发光,但是,他们实际上并不是作为光源.需要创建一个光源,放在和物体相同的位置,以创建这种效果