Color problem: GL_ABMIENT and GL_DIFFUSE dont work

Hi, I’m having a problem to get GL_ABMIENT and GL_DIFFUSE for the material to work; they seem to simply be set to the color which I have previously specified with glColor4f. However, GL_SPECULAR does work. I’m using the code below to specify some flags that OpenGL should use as well as the colors of the light and the material:


    // OpegGL flags
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
    glEnable(GL_COLOR_MATERIAL); // Enables color to work together with lighting
    glEnable(GL_NORMALIZE);
    glEnable(GL_DEPTH_TEST);
    //glShadeModel(GL_SMOOTH); // Enable Gouraud shading
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, 0); // Unbind texture
    
    // Light and materials
    glColor4f(1, 1, 1, 1); // Set current color to white
    GLfloat light_position[] = {1.0f, 0.0f, 0.0f, 0.0f}; // From the right
    GLfloat light_color[] = {1.0f, 1.0f, 1.0f, 1.0f}; // White light
    GLfloat ambient_color[] = {0.2f, 0.2f, 0.2f, 1.0f}; // Weak white light
    GLfloat mat_shininess[] = {50.0};
    GLfloat mat_ambientColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
    GLfloat mat_diffuseColor[] = {0.0f, 0.0f, 0.0f, 1.0f};
    GLfloat mat_specularColor[] = {1.0f, 0.0f, 0.0f, 1.0f};

    // Set current material  
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
    glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambientColor);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuseColor);
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specularColor);

    // Set light
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient_color);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_color);
    glLightfv(GL_LIGHT0, GL_SPECULAR, light_color);

As you can see, I’m trying to set all the reflecting properties of the material to black except from the specular reflectance, which I set to red. However, when I render an object (I use a sphere for trying out the settings) afterwards, mat_ambientColor and mat_diffuseColor don’t have any effect - the sphere gets white, as specified by the glColor4f call (I have tried feeding this function with other colors too). mat_specularColor on the other hand, does have effect since the specular reflectance is red and is totally unaffected by the color I specify with glColor.

Why don’t I get the right ambient and diffuse colors on the material?

Because you do: glEnable(GL_COLOR_MATERIAL);
Look at the glColorMaterial man page, it defaults to GL_AMBIENT_AND_DIFFUSE, so you are requesting to ignore your material’s ambient and diffuse and use the vertex colors for those instead.

It seems like that did the trick. Thanks! :slight_smile: I just used glDisable(GL_COLOR_MATERIAL); instead of glEnable(GL_COLOR_MATERIAL); and that made it take every color I specified for the material’s different color properties. In the man pages of glColorMaterial, it says that “If only such a subset of parameters is to be specified for each vertex, calling glColorMaterial is preferable to calling glMaterial”. Why, does this optimize the performance in some way?