На 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: Nicol, спасибо за упоминание о матрице проекции. Похоже, что она была установлена неправильно. Я некоторое время следовал вашему руководству на arcsynthesis.org и адаптировал код к своему собственному проекту, но я отклонился от вашей матрицы проекции и использовал математику, описанную на странице руководства glFrustum, чтобы реализовать свою собственную версию этой функции, а затем использовал замену gluPerspective от NeHe, чтобы заменить gluPerspective. Я не знаю, почему замены не сработали, потому что математика моей матрицы верна (я проверил ее на различных онлайн-калькуляторах). Используя вашу матрицу, я получаю правильный результат с GL_LESS.