缩放gluQuadric时颜色会发生变化

时间:2014-11-14 16:44:34

标签: opengl colors scale

当我绘制缩放(使用glScale)gluSphere时,我遇到了问题。 缩放后颜色会发生变化,而较暗的面部不会像它们应该的那样黑暗......

这就是我设置灯光的方式:

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

这是我的代码,它设置了一个新的glList,其中绘制了Glu Sphere:

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

以下是调用List的代码:

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

使用'glScalef(1.0f,1.0f,1.0f)'绘制的球体(无比例)

No Scale

使用'glScalef(6.0f,6.0f,6.0f)'

绘制的球体

Scale

我希望你有任何想法,为什么事情可能不起作用。

1 个答案:

答案 0 :(得分:2)

法线未正确缩放(缩放后它们是非单位长度)。

您有两种方法可以解决这个问题:

  1. GL_NORMALIZE - 这将重新规范您的法线,这是非常昂贵的。
  2. GL_RESCALE_NORMAL - 这只是重新缩放它们。
  3. 选项#2就是你想要的,因为你应用了一个统一的比例(每个方向 6.0x )。如果您应用了非统一比例(例如 glScalef (1.0f, 6.0f, 3.0f)),那么这将不是一个有效选项,您将不得不求助于选项#1。

    在任何一种情况下,您只需启用GL_NORMALIZEGL_RESCALE_NORMAL即可解决此问题。