В GL wiki они рекомендуют использовать GL_LEQUAL для функции глубины. Кроме того, функция глубины по умолчанию GL_LESS. Когда я использую любую из этих функций, я получаю странные результаты. На этом рисунке красный квадрат должен быть перед синим (оба квадрата одинакового размера):
Однако, если я использую glClearDepth(0.0)
, а затем glDepthFunc(GL_GREATER)
, запустив остальную без изменений программу, я получу это:
Если подумать немного больше, то имеет смысл, что GL_LESS даст результаты, которые он делает: если входящее значение глубины меньше сохраненного, фрагмент записывается.
Если я расположил камеру на (1, 0, 0)
и посмотрел в сторону (0, 0, 0)
, я ожидаю, что объект на (0.5, 0, 0)
будет перед объектом на (0, 0, 0)
. С GL_LESS не будет ли объект в (0, 0, 0)
тем, чьи фрагменты написаны?
EDIT:
Никол, спасибо за упоминание матрицы проекции. Кажется, что он был установлен неправильно. Я некоторое время следил за вашим руководством на arcsynthesis.org и адаптировал код для своего собственного проекта, но я отклонился от вашей матрицы проекции и использовал математику, описанную на странице руководства glFrustum, для реализации моей собственной версии этой функции, а затем использовал NeHe gluPerspective замена на замену gluPerspective. Я не знаю, почему замены не работали, потому что моя матричная математика верна (я проверил это по различным онлайн-калькуляторам). Используя вашу матрицу, я получаю правильный результат с GL_LESS.