为什么金字塔可以使用 GL_SMOOTH 着色,而另一个立方体只能像 GL_FLAT 那样着色?

Why the pyramid can be color using GL_SMOOTH while the other one cube was just colored like a GL_FLAT one?

这段代码是绘制一个金字塔和一个立方体。我正在尝试通过 glShadeModel 使用 GL_SMOOTH 类型为它们着色。但结果是只有金字塔可以是光滑的,而另一个立方体只能像 GL_FLAT 那样着色。

法向量好像有点问题,我这方面很差

下面是我的代码:

void initGL() {

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClearDepth(1.0f);                   // Set background depth to farthest
    glEnable(GL_DEPTH_TEST);   // Enable depth testing for z-culling
    glDepthFunc(GL_LEQUAL);    // Set the type of depth-test
    glShadeModel(GL_SMOOTH);   // Enable smooth shading
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}
void display() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    glTranslatef(1.5f, 0.0f, -7.0f);

    glBegin(GL_QUADS); 
       glColor3f(0.0f, 1.0f, 0.0f);     // Green
       glVertex3f( 1.0f, 1.0f, -1.0f);
       glVertex3f(-1.0f, 1.0f, -1.0f);
       glVertex3f(-1.0f, 1.0f,  1.0f);
       glVertex3f( 1.0f, 1.0f,  1.0f);

      // Bottom face (y = -1.0f)
       glColor3f(1.0f, 0.5f, 0.0f);     // Orange
       glVertex3f( 1.0f, -1.0f,  1.0f);
       glVertex3f(-1.0f, -1.0f,  1.0f);
       glVertex3f(-1.0f, -1.0f, -1.0f);
       glVertex3f( 1.0f, -1.0f, -1.0f);

      // Front face  (z = 1.0f)
       glColor3f(1.0f, 0.0f, 0.0f);     // Red
       glVertex3f( 1.0f,  1.0f, 1.0f);
       glVertex3f(-1.0f,  1.0f, 1.0f);
       glVertex3f(-1.0f, -1.0f, 1.0f);
       glVertex3f( 1.0f, -1.0f, 1.0f);

      // Back face (z = -1.0f)
       glColor3f(1.0f, 1.0f, 0.0f);     // Yellow
       glVertex3f( 1.0f, -1.0f, -1.0f);
       glVertex3f(-1.0f, -1.0f, -1.0f);
       glVertex3f(-1.0f,  1.0f, -1.0f);
       glVertex3f( 1.0f,  1.0f, -1.0f);

      // Left face (x = -1.0f)
       glColor3f(0.0f, 0.0f, 1.0f);     // Blue
       glVertex3f(-1.0f,  1.0f,  1.0f);
       glVertex3f(-1.0f,  1.0f, -1.0f);
       glVertex3f(-1.0f, -1.0f, -1.0f);
       glVertex3f(-1.0f, -1.0f,  1.0f);

      // Right face (x = 1.0f)
       glColor3f(1.0f, 0.0f, 1.0f);     // Magenta
       glVertex3f(1.0f,  1.0f, -1.0f);
       glVertex3f(1.0f,  1.0f,  1.0f);
       glVertex3f(1.0f, -1.0f,  1.0f);
       glVertex3f(1.0f, -1.0f, -1.0f);
    glEnd();  // End of drawing color-cube

   // Render a pyramid consists of 4 triangles
    glLoadIdentity();                  // Reset the model-view matrix
    glTranslatef(-1.5f, 0.0f, -6.0f);  // Move left and into the screen

    glBegin(GL_TRIANGLES);           // Begin drawing the pyramid with 4 triangles
      // Front
       glColor3f(1.0f, 0.0f, 0.0f);     // Red
       glVertex3f( 0.0f, 1.0f, 0.0f);
       glColor3f(0.0f, 1.0f, 0.0f);     // Green
       glVertex3f(-1.0f, -1.0f, 1.0f);
       glColor3f(0.0f, 0.0f, 1.0f);     // Blue
       glVertex3f(1.0f, -1.0f, 1.0f); 

      // Right
       glColor3f(1.0f, 0.0f, 0.0f);     // Red
       glVertex3f(0.0f, 1.0f, 0.0f);
       glColor3f(0.0f, 0.0f, 1.0f);     // Blue
       glVertex3f(1.0f, -1.0f, 1.0f);
       glColor3f(0.0f, 1.0f, 0.0f);     // Green
       glVertex3f(1.0f, -1.0f, -1.0f);

      // Back
       glColor3f(1.0f, 0.0f, 0.0f);     // Red
       glVertex3f(0.0f, 1.0f, 0.0f);
       glColor3f(0.0f, 1.0f, 0.0f);     // Green
       glVertex3f(1.0f, -1.0f, -1.0f);
       glColor3f(0.0f, 0.0f, 1.0f);     // Blue
       glVertex3f(-1.0f, -1.0f, -1.0f);

      // Left
       glColor3f(1.0f,0.0f,0.0f);       // Red
       glVertex3f( 0.0f, 1.0f, 0.0f);
       glColor3f(0.0f,0.0f,1.0f);       // Blue
       glVertex3f(-1.0f,-1.0f,-1.0f);
       glColor3f(0.0f,1.0f,0.0f);       // Green
       glVertex3f(-1.0f,-1.0f, 1.0f);
    glEnd();   // Done drawing the pyramid

    glutSwapBuffers();  // Swap the front and back frame buffers (double buffering)
}

谁能告诉我这是怎么发生的?

当您绘制金字塔时,您会为三角形图元的每个顶点坐标关联一种颜色。例如:

glColor3f(1.0f, 0.0f, 0.0f);     // Red
glVertex3f( 0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);     // Green
glVertex3f(-1.0f, -1.0f, 1.0f);
glColor3f(0.0f, 0.0f, 1.0f);     // Blue
glVertex3f(1.0f, -1.0f, 1.0f); 

这导致顶点(角)的颜色被插值到三角形上。

当您绘制立方体时,您已经为每个四边形设置了一种颜色。四边形的每个角都与相同的颜色相关联:

glColor3f(0.0f, 1.0f, 0.0f);     // Green
glVertex3f( 1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f, -1.0f);
glVertex3f(-1.0f, 1.0f,  1.0f);
glVertex3f( 1.0f, 1.0f,  1.0f);

这导致整个四边形图元颜色均匀。如果你想要颜色渐变,那么你必须将不同的颜色关联到顶点(角)。