OpenGL: Как решить проблему освещения Cube?

Изображение куба

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

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

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


person 전철웅    schedule 02.04.2020    source источник
comment
Что вы имеете в виду под отсутствием разницы в цвете? Это куб; если вы правильно используете освещение, то вы увидите разницу в цвете по краям. Эта разница в цвете - это то, как наши глаза узнают, что в этом вообще есть преимущество.   -  person Nicol Bolas    schedule 02.04.2020


Ответы (1)


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

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

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 (справа):

person Rabbid76    schedule 02.04.2020