Search code examples
openglcolorsscale

Color changes when scaling a gluQuadric


I have a problem when I draw a scaled (with glScale) gluSphere. The Color changes after Scaling and the darker faces are not as dark as they should be...

This is how I set up the light:

glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_COLOR_MATERIAL);
glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);

GLfloat LAmbient[4] = {0.2f, 0.2f, 0.2f, 1.0};
GLfloat LDiffuse[4] = {1.0f, 1.0f, 1.0f, 1.f};
GLfloat LSpecular[4] = {1.0f, 1.0f, 1.0f, 0.0f};
GLfloat LPosition[4] = {100.0f, -200.0f, -50.0f, 0.0f};
GLfloat LSpotDirec[3] = {0.0,0.0,0.0};
GLfloat LSpotCutOff = 180.0f;
GLfloat LSpotExponent = 0.0f;
GLfloat LAttenuationConst = 1.0f;
GLfloat LAttenuationLinear = 0.0f;
GLfloat LAttenuationQuadrat = 0.0f;

glLightfv(GL_LIGHT0, GL_AMBIENT, LAmbient);
glLightfv(GL_LIGHT0, GL_DIFFUSE, LDiffuse);
glLightfv(GL_LIGHT0, GL_SPECULAR, LSpecular);
glLightfv(GL_LIGHT0, GL_POSITION, LPosition);
glLightfv(GL_LIGHT0, GL_SPOT_DIRECTION, LSpotDirec);
glLightfv(GL_LIGHT0, GL_SPOT_CUTOFF, &LSpotCutOff);
glLightfv(GL_LIGHT0, GL_SPOT_EXPONENT, &LSpotExponent);
glLightfv(GL_LIGHT0, GL_CONSTANT_ATTENUATION, &LAttenuationConst);
glLightfv(GL_LIGHT0, GL_LINEAR_ATTENUATION, &LAttenuationLinear);
glLightfv(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, &LAttenuationQuadrat);

Here is my code, that sets up a new glList, where the glu Sphere is drawn:

//Sphere 
GLUquadric * pSphere = gluNewQuadric();
glNewList(LIST_SPHERE, GL_COMPILE);//'LIST_SPHERE' is defined above
    gluQuadricTexture(pSphere, GL_FALSE);
    gluQuadricOrientation(pSphere, GLU_OUTSIDE);
    gluQuadricDrawStyle(pSphere, GLU_FILL);
    gluQuadricNormals(pSphere, GLU_SMOOTH);
    gluQuadricCallback(pSphere, GLU_ERROR, NULL);
    gluSphere(pSphere, 1.0f, 20, 10);
glEndList();

and here is the code, where the List is called:

glPushMatrix();
//drawing a white Sphere with a radius of 6
glColor3f(1.0f, 1.0f, 1.0f);
glScalef(6.f,6.f,6.f);
glCallList(LIST_SPHERE);

glPopMatrix();

Sphere drawn with 'glScalef(1.0f, 1.0f, 1.0f)' (no scale)

  No Scale

Sphere drawn with 'glScalef(6.0f, 6.0f, 6.0f)'

  Scale

I hope you have any Idea, why things are not working probably.


Solution

  • The normals are not being scaled correctly (they are non-unit length after scaling).

    You have two options to solve this:

    1. GL_NORMALIZE -- This will renormalize your normals, which is costly.
    2. GL_RESCALE_NORMAL -- This will simply rescale them.

    Option #2 is what you want here, since you applied a uniform scale (6.0x in every direction). If you had applied a non-uniform scale (e.g. glScalef (1.0f, 6.0f, 3.0f)) then this would not be a valid option and you would have to resort to option #1.

    In either case, all you need to do is enable GL_NORMALIZE or GL_RESCALE_NORMAL to solve this problem.