OpenGL: как решить проблему освещения Cube? - PullRequest
1 голос
/ 02 апреля 2020

Cube image

// Vertices information
GLfloat vertices[] = { 1, 1, 1,  -1, 1, 1,  -1,-1, 1,   1,-1, 1, // (front)
                    1, 1, 1,   1,-1, 1,   1,-1,-1,   1, 1,-1,   // (right)
                    1, 1, 1,   1, 1,-1,  -1, 1,-1,  -1, 1, 1,   // (top)
                   -1, 1, 1,  -1, 1,-1,  -1,-1,-1,  -1,-1, 1,   // (left)
                   -1,-1,-1,   1,-1,-1,   1,-1, 1,  -1,-1, 1,   // (bottom)
                    1,-1,-1,  -1,-1,-1,  -1, 1,-1,   1, 1,-1 }; // (back)

// Normal information
GLfloat normals[72] = { 0, 0, 1,   0, 0, 1,   0, 0, 1,   0, 0, 1,   // (front)
                    1, 0, 0,   1, 0, 0,   1, 0, 0,   1, 0, 0,   // (right)
                    0, 1, 0,   0, 1, 0,   0, 1, 0,   0, 1, 0,   // (top)
                   -1, 0, 0,  -1, 0, 0,  -1, 0, 0,  -1, 0, 0,   // (left)
                    0,-1, 0,   0,-1, 0,   0,-1, 0,   0,-1, 0,   // (bottom)
                    0, 0,-1,   0, 0,-1,   0, 0,-1,   0, 0,-1 }; // (back)

// drawing cube
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glNormalPointer(GL_FLOAT, 0, normals);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, indices);
glPopMatrix();
glDisableClientState(GL_VERTEX_ARRAY); 
glDisableClientState(GL_NORMAL_ARRAY);

Я хочу убедиться, что между двумя сторонами нет цветовых различий.

Есть ли решение для этого?

1 Ответ

0 голосов
/ 02 апреля 2020

Причина заключается в том, что вы активировали режим плоского затенения (см. Обнаружение устаревших OpenGL и glShadeModel). Таким образом, свет вычисляется для вершин примитива треугольника , но цвет треугольника определяется с помощью Provoking vertex .

Переключение на сглаживание ( GL_SMOOTH) модель затенения и убедитесь, что свет рассеянный (параметр GL_DIFFUSE - см. glLight):

glShadeModel(GL_SMOOTH);

См. Разницу между режимом затенения GL_FLAT ( слева) и GL_SMOOTH (справа):


Другим вариантом будет визуализация GL_QUADS примитивов вместо GL_TRIANGLES примитивов :

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, indices)

glDrawArrays(GL_QUADS, 0, 24);

Опять GL_FLAT (слева) и GL_SMOOTH (справа):

...