在一般状态下,当把一个纹理应用于一个片断时,只有主颜色与纹理单元的颜色进行了组合.主颜色可能是光照计算的结果,也可能是通过glColor*()函数指定的值.
在纹理处理之后,但在进行雾计算之前,可以对片断应用一种辅助颜色.辅助颜色的应用可以使经过纹理贴图的物体具有更真实的高光效果.
如果当前并没有启用光照,并且启用了颜色求和模式(使用glEnable(GL_COLOR_SUM)),那么当前的辅助颜色(由glSecondaryColor*()所设置)便被加到经过纹理处理后的片断颜色上.
纹理操作是在光照之后进行的,但把镜面亮点和纹理的颜色进行混合通常会减弱光照的效果. 可以为每个顶点计算两种颜色:一种是主颜色,由所有的非镜面成分组成,另一种是辅助颜色,由所有的镜面成分组成的和.如果把镜面颜色分离来,辅助(镜面)颜色就会在纹理计算之后再添加到片断中.
如果当前启用了光照,就会应用辅助镜面颜色,而不管是否为GL_COLOR_SUM模式,并且glSecondaryColor*所设置的任何辅助颜色都会被忽略.
摘自《OpenGL编程指南》第5版,随手翻看时觉得很有体会,摘下以备忘,WoW里的高光应该就是用SecondaryColor实现的.SecondaryColor相当于一层额外的纹理层.
DM引擎转入实现室内环境,有卡马克的Quake3引擎源码在手,应该不会有太陡的阻力,并借此机会深入学习一下大师的编码和思想.