首页>
知识库>
详情

glColorMaterial()的使用

2020-07-21 来源:CloudBest 阅读量: 0
关键词:

    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
    #include
    #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在消隐方面为我们做的工作。记的我们前面的用彩色平面。