Фоновый объект рисуется перед объектом переднего плана в OpenGL? - PullRequest
2 голосов
/ 16 марта 2011

Для тестирования предположим, что я нарисовал 2 чайника с glutSolidTeapot(), например:

glColor3f(1.0f, 0.0f, 0.0f); // Red teapot
glutWireTeapot(1.0f);

glColor3f(0.0f, 1.0f, 0.0f); // Green teapot
glTranslatef(0.0f, 0.0f, 3.0f);
glutWireTeapot(1.0f);

Камера изначально расположена на (x,y,z) = (0.0f, 0.0f, 5.0f), а я смотрю на z = -1 (это позиция камеры # 1). Я уверен, что вы понимаете, что зеленый чайник - самый близкий объект к камере, а красный - позади него. Проблема в том, что красный нарисован так, как будто он перед зеленым, который выглядит неправильно:

Пример: http://i.stack.imgur.com/8WoEn.png

Теперь, если я тоже переместу камеру (x,y,z) = (0.0f, 0.0f, -5.0f) и посмотрю на z = 1 (это позиция камеры # 2), я увижу красный чайник перед зеленым, это нормальное поведение. Красный - теперь объект, ближайший к камере, а зеленый - позади красного. Все хорошо.

Пример: http://i.stack.imgur.com/eJvPE.png

Я знаю, что это как-то связано с порядком, если я переключу код выше (сначала код зеленого чайника), то это исправит проблему в положении камеры № 1, но проблема теперь будет видна в положении камеры # 2.

Почему это происходит и как я могу удержать объекты за другими объектами от прорисовки спереди или вообще?

Ответы [ 2 ]

7 голосов
/ 16 марта 2011

Вам нужно выделить буфер глубины (вы, скорее всего, уже делаете это), а затем использовать glEnable(GL_DEPTH_TEST)

Это происходит потому, что без тестирования глубины OpenGL просто не реагирует на разные глубины.относительно камеры.Когда вы включите тестирование глубины, GL отклонит все новые пиксели / фрагменты, которые находятся дальше, чем текущий ближайший.

Если вы хотите перемещаться по сцене, вы, вероятно, захотите очистить глубину, добавив GL_DEPTH_BUFFER_BITв glClear, иначе он запомнит ближайший фрагмент из предыдущего кадра.

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

3 голосов
/ 16 марта 2011

Возможно, вы не включили Depth Buffer aka z-buffer. Для этого в части инициализации добавьте что-то вроде этого

glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);

И перед рендерингом каждого кадра необходимо также очистить этот буфер, используя

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

Вы можете проверить учебник OpenGL Nehe для получения дополнительной информации http://nehe.gamedev.net/data/lessons/lesson.asp?lesson=01

...