glEnable(GL_COLOR_MATERIAL)适用于所有绘制的对象

时间:2014-10-29 18:29:42

标签: opengl visual-c++

我正在开发一个用于大学项目的Frogger游戏版本,我们得到了光和材料部分。我遇到的问题是:当我为青蛙设置材料时,它会将它们应用于绘制的所有其他对象。 我如何制作它只适用于青蛙? 如果我在绘制后或在设置材料属性后禁用GL_COLOR_MATERIAL,则一切都会变为红色。

void Frog::draw(void)
{
    Vector3 _pos = Entity::getPosition();

    glPushMatrix();

    glEnable(GL_COLOR_MATERIAL);

    GLfloat greenEmissiveMaterial[] = {1.0, 0.0, 0.0};
    glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);

    GLfloat mat_ambient[] = {0.7, 0.0, 0.0, 1.0};
    GLfloat mat_diffuse[] = { 0.7, 0.0, 0.0, 1.0 };
    GLfloat mat_specular[] = { 0.0, 0.0, 0.0, 0.0 };
    GLfloat mat_shininess[] = {1.8 };

    glColor3f(1.0, 0.0, 0.0);

    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);

glDisable(GL_COLOR_MATERIAL);

    glScalef(0.1, 0.1, 0.1);
    glTranslatef( _pos.getX()*U , _pos.getY()*U , 1 );
    //CORPO
    glPushMatrix();
    glColor3f(0.0, 1.0, 0.0);
    glutSolidSphere(0.5,50,50);
    glPopMatrix();

    glPushMatrix();
    glColor3f(0.0, 1.0, 0.0);
    glTranslatef(0.0, 0.5, 0.0);
    glutSolidSphere(0.3,50,50);
    glPopMatrix();


    glPopMatrix();

}

1 个答案:

答案 0 :(得分:5)

启用状态GL_COLOR_MATERIAL会使材质颜色跟踪您在调用glColorMaterial (...)时指定的面部的当前颜色。换句话说,虽然已启用GL_COLOR_MATERIAL并且已设置glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE),但GL_AMBIENTGL_DIFFUSE的值仅由当前颜色确定 对于前面。

因此,以下调用:

glColor3f (1.0f, 0.0f, 0.0f);

在您的软件中实际上与此相同:

glColor3f (1.0f, 0.0f, 0.0f); // Set the "current" color

GLfloat red [3] = { 1.0f, 0.0f, 0.0f };

glMaterialfv (GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);

您可以看到您已将GL_AMBIENTGL_DIFFUSE的值更改为红色。并且您还尝试在原始代码中启用该状态时手动更改环境/漫反射材质颜色,这不会做任何事情。

此处更详细地描述了上述行为:

  

名称

     
    

glColorMaterial - 使材质颜色跟踪当前颜色

  
     

C规范

     
    

void glColorMaterial(GLenum face,                              GLenum模式);

  
     

描述

     
    

glColorMaterial 指定哪些材质参数跟踪当前颜色。启用GL_COLOR_MATERIAL时,由mode指定的材质参数或参数指定的材料参数 始终跟踪当前颜色 。< / p>          

要启用和停用GL_COLOR_MATERIAL,请使用参数glEnable调用 glDisable GL_COLOR_MATERIAL GL_COLOR_MATERIAL最初已停用

  

如果您想停止跟踪当前颜色并使用mat_ambientmat_diffuse中的值,那么您应该在 之后添加以下代码 您停用了GL_COLOR_MATERIAL

glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);