发信人: yxy (田丝丝#冬眠的小肥鹰), 信区: GAME_Designer 
标  题: OPENGL(8) 
发信站: BBS 水木清华站 (Mon Jan 19 16:59:50 1998) 
 
这次把材质完全搞定,呵呵 
上次12个不同的立体材质球的程序运用glMaterialfv()来改变材质 
有其固有的系统消耗。 
 
另外同样的功能可以使用: 
void glColorMaterial(GLenum face,GLenum mode)来实现。 
face的取值: 
GL_FRONT GL_BACK GL_FRONT_AND_BACK 
mode的取值: 
GL_AMBIENT GL_DIFFUSE GL_AMBIENT_AND_DIFFUSE GL_SPECULAR GL_EMISSION 
 
在想要使用这个函数时,要启用glEnable(GL_COLOR_MATERIAL)来是函数工作 
在绘图时使用glColor*()来改变材质颜色,或用glMaterial()来改变材质成分 
使用完毕,要用glDisable(GL_COLOR_MATERIAL)来关闭这种材质模式。 
 
例如: 
glColorMaterial(GL_FRONT,GL_DIFFUSE); 
glEnable(GL_COLOR_MATERIAL); 
 
glColor3f(0.3,0.5,0.7); 
//画一些物体: 
... 
 
glColor3f(0.0,1.0,0.0); 
//再画另一些物体: 
... 
 
glDisable(GL_COLOR_MATERIAL); 
 
说明: 
当需要改变场景中大部分方面的单个材质时,最好调用glColorMaterial() 
当修改不只一个材质参数,最好调用glMaterial*(),这是目前我体会到 
唯一的使用功能上的不同点吧。 
请看下面例子: 
///////////////////////////////////////////////////////// 
//sample.cpp 
#include "glos.h" 
#include <GL/gl.h> 
#include <GL/glaux.h> 
#include "windows.h" 
void myinit(void); 
void CALLBACK  display(void); 
void CALLBACK  reshape(GLsizei w,GLsizei h); 
 
void myinit(void) 

        auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); 
        auxInitPosition(0,0,500,500); 
        auxInitWindow("sample1"); 
        glClearColor(0.0,0.1,0.1,0.0); 
        glClear(GL_COLOR_BUFFER_BIT); 
//      glShadeModel(GL_FLAT); 
 
//定义一个白色简单光源 
        GLfloat light_position[]={0.0,3.0,2.0,0.0}; 
        glLightfv(GL_LIGHT0,GL_POSITION,light_position); 
        glEnable(GL_LIGHTING); 
        glEnable(GL_LIGHT0); 
 
//启用消隐 
        glDepthFunc(GL_LESS); 
        glEnable(GL_DEPTH_TEST); 
    
//启用颜色材质模式 
        glColorMaterial(GL_FRONT,GL_DIFFUSE); 
        glEnable(GL_COLOR_MATERIAL); 

 
void CALLBACK reshape(GLsizei w,GLsizei h) 

glViewport(0,0,w,h); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
if(w<=h) 
 glOrtho(-6.0,6.0,-6.0*(GLfloat)h/(GLfloat)w, 
         6.0*(GLfloat)h/(GLfloat)w,-10.0,10.0); 
else 
  glOrtho(-6.0*(GLfloat)h/(GLfloat)w, 
         6.0*(GLfloat)h/(GLfloat)w,-6.0,6.0,-10.0,10.0); 
 
glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

 
void CALLBACK display(void) 

    glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); 
 
//先画一个黄色材质的球 
        glLoadIdentity(); 
        glTranslatef(-0.7,0.0,0.0); 
        glColor3f(1.0,1.0,0.0); 
        auxSolidSphere(1.0); 
 
//再在黄球的右边2.7处画一个红色的球 
        glLoadIdentity(); 
        glRotatef(-60.0,1.0,0.0,0.0); 
        glTranslatef(2.7,0.0,0.0); 
        glColor3f(1.0,0.0,0.0); 
        auxSolidSphere(1.0); 
 
//再再黄球左边(两球之间)靠后的位置画一个青色三角锥 
        glLoadIdentity(); 
        glTranslatef(-1.0,-1.0,-5.0); 
        glRotatef(30.0,1.0,0.0,0.0); 
        glColor3f(0.0,1.0,1.0); 
        auxSolidCone(2.0,2.0); 
 
    glFlush(); 

void main(void) 

    myinit(); 
     
    auxReshapeFunc(reshape); 
    auxMainLoop(display); 

//end of sample 
//////////////////////////////////////////////////////////// 
通过这个例子,我们除了可以熟悉glColorMaterial()的使用,还可以 
体会到OPENGL在消隐方面为我们做的工作。记的我们前面的用彩色平面 
绘制三角锥的例子吗?那里可是哪个平面后画,哪个平面遮挡以前的平面。 
这里我们看到虽然三角锥虽然最后画出,但是OPENGL的消隐功能已经保证 
乐它实际应该被消隐。你可以试试取消myinit()中消隐的两句程序,那么 
三角锥就跑到前面来乐,呵呵。 
 
-- 
※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 166.111.74.90]