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

1 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();

}
Run Code Online (Sandbox Code Playgroud)

And*_*man 5

启用状态GL_COLOR_MATERIAL会使材质颜色跟踪您在调用中指定的面的当前颜色glColorMaterial (...).换句话说,虽然GL_COLOR_MATERIAL已启用且glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE)已设置,但是GL_AMBIENT和的值由正面的当前颜色GL_DIFFUSE确定.

因此,以下调用:

glColor3f (1.0f, 0.0f, 0.0f);
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

您可以看到已将GL_AMBIENT和的值更改GL_DIFFUSE红色.并且您还尝试在原始代码中启用该状态时手动更改环境/漫反射材质颜色,这不会执行任何操作.

上面的行为在这里有更详细的描述:

名称

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

C规格

void glColorMaterial(GLenum face,GLenum mode);

描述

glColorMaterial指定哪些材质参数跟踪当前颜色.当GL_COLOR_MATERIAL被启用时,材料参数或多个参数由模式指定,材料或通过面指定的材料,跟踪在所有时间的当前颜色.

要启用和禁用GL_COLOR_MATERIAL,请调用glEnableglDisable使用参数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);
Run Code Online (Sandbox Code Playgroud)