Глубина OpenGL не работает должным образом

я использую OpenGL нарисовать некоторое содержимое на экране.

Вот инициализация:

glViewport(0, 0, width, height);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, width, height, 0, 10, -10);
glMatrixMode(GL_MODELVIEW);

Затем я рисую объекты, используя это:

void draw(...)
{
glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBegin(GL_QUADS);  //Begining the cube's drawing
{
glTexCoord3f(tu1, tv1, 1);  glVertex3f(offset,      _y, _z);
glTexCoord3f(tu2, tv1, 1);  glVertex3f(offset + w,  _y, _z);
glTexCoord3f(tu2, tv2, 1);  glVertex3f(offset + w,  _y + h,  _z);
glTexCoord3f(tu1, tv2, 1);  glVertex3f(offset,      _y + h,  _z);
}
glEnd();
glDisable(GL_BLEND);
glDisable(GL_TEXTURE_2D);
}

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

Если я сначала нарисую розовую полосу:

введите описание изображения здесь

Если я нарисую розовую полосу после кремовой полосы:

введите описание изображения здесь

0

Решение

Когда вы видите алгоритм художника (последний нарисованный объект появляется спереди), это означает проблему с вашим буфером глубины. В вашем случае вам нужно включить глубинное тестирование и запись и в вашей инициализации (по умолчанию выключен):

glEnable(GL_DEPTH_TEST);

Вы также захотите очистить буфер глубины в начале каждого кадра (очистка цветового буфера, как правило, также хорошая идея):

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Посмотрите, что OpenGL вики может сказать о буферизация глубины.

5

Другие решения

Пожалуйста, имейте в виду следующие пункты, которые могут вам помочь:
1. OpenGL следует правилу правой руки.
2. Если вы используете push и pops для обработки матриц, то последняя, ​​которую вы нажимаете, является первой, которая применяется во время рендеринга.

-1

По вопросам рекламы [email protected]