Почему пирамида может быть цветной, используя GL_SMOOTH, в то время как другой куб был просто окрашен как GL_FLAT? - PullRequest
1 голос
/ 24 октября 2019

Этот код должен нарисовать одну пирамиду и один куб. Я пытаюсь раскрасить их, используя GL_SMOOTH type by glShadeModel. Но в результате получается, что только пирамида может быть гладкой, в то время как другой куб был окрашен только как 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)
}

Может кто-нибудь сказать мнекак это могло случиться?

1 Ответ

0 голосов
/ 24 октября 2019

Когда вы рисуете пирамиду, у вас есть один цвет, связанный с каждой вершиной координат примитивов треугольника. Например:

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

Это приводит к тому, что весь примитив четырехугольника имеет однородный цвет. Если вам нужен цветовой градиент, вам нужно связать разные цвета с вершинами (углами).

...