Использование glDepthFunc (GL_GREATER) не будет ничего рисовать - PullRequest
0 голосов
/ 01 февраля 2019

Я запускаю следующий код для рисования прямоугольников с помощью функции GL_GREATER, но вместо того, чтобы получить цвет самого дальнего прямоугольника от камеры, я получаю белый экран.

glClearColor(1, 1, 1, 1);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_GREATER);
glOrtho(-1, 1, -1, 1, -1, 1);
glColor3f(1, 0, 0);
glPushMatrix();
glTranslatef(0, 0, -0.5);
glRectf(-1, -1, 1, 1);
glColor3f(0, 1, 0);
glTranslatef(0, 0, 1);
glRectf(-1, -1, 1, 1);
glColor3f(0, 0, 1);
glPopMatrix();
glRectf(-1, -1, 1, 1);

Так что яЯ ожидаю увидеть самый дальний цвет прямоугольника на экране, который является зеленым (что также странно, потому что zNear равен -1, а использование GL_LESS рисует зеленый вместо красного - я не понимаю, почему так).однако, используя GL_GREATER, я получаю белый экран вместо зеленого.Что мне здесь не хватает?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

По умолчанию значения в буфере глубины находятся в диапазоне [0, 1].См. glDepthRange.
Когда буфер глубины очищен, значения глубины по умолчанию устанавливаются в 1.См. glClearDepth.

Если каждое значение в буфере глубины равно 1, а проверка глубины - GL_GREATER, то проверка глубины в любом случае не удастся, потому что глубина не может бытьбольше 1.
Значение, которое используется для очистки буфера глубины, можно изменить с помощью glClearDepth.

Установите значение очистки для буфера глубины на 0 вместо1, до очистки буфера:

glClearColor(1, 1, 1, 1); 
glClearDepth(0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);
0 голосов
/ 01 февраля 2019

Если вы переворачиваете сравнение, вы также должны перевернуть значение очистки буфера глубины с помощью glClearDepth.Установите его на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...