Правила Zbuffer для gl_Position
Вопрос
Вот мои настройки для opengl, если они имеют значение:
GenracodicetagpreНекоторое время я думал, что плоскости отсечения будут применяться ко всему, для чего gl_Position.z находится за пределами от -1 до 1. Но даже когда я устанавливаю gl_Position.z на постоянное число в шейдере:
GenracodicetagpreПо-прежнему существует правильная z-буферизация и отсечение на основе gl_Position.w!Так каковы правила?
Решение
Значение gl_Position находится в том, что OpenGL называет «пространством клипа». Это однородная система координат . В частности, размеры XYZ пространства клипа равны [-W, + W]. Таким образом, каждая вершина находится в своем собственном пространстве клипов.
Я не совсем понимаю, что вы имеете в виду, говоря «каковы правила». Clip-space gl_Position обрезается по области просмотра в однородном пространстве. Таким образом, они привязаны к области [-W, + W] для каждой вершины. Трудно представить это в проективном однородном пространстве, но математика работает, так что это не имеет значения.
После этого обрезанные вершины преобразуются в пространство нормализованных координат устройства (NDC). Это означает разделение XYZ пространства клипа на W. Все эти вершины находятся в диапазоне [-1, 1].
Оттуда происходит преобразование области просмотра. Параметры glViewport
масштабируют вершины от пространства NDC [-1, 1] до области окна просмотра. Это преобразует точки в пространство окна; именно в оконном пространстве они растрируются.
XY оконного пространства контролируется с помощью glViewport
. Значения Z для оконного пространства контролируются с помощью glDepthRange
. Диапазон глубины по умолчанию - это ближайшее значение 0 и дальнее значение 1 (ВНИМАНИЕ: ближняя / дальняя плоскости матрицы перспективы не имеют ничего общего с диапазоном глубины. Не путайте их). Таким образом, он отображает [-1, 1] Z в пространстве NDC на [близко, далеко] в оконном пространстве.
Таковы «правила».
Другие советы
Вы используете glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL);
Буфер глубины имеет значение от 0 до 1 (максимальная глубина), используйте параметр GL_LEQUAL, что означает, что все будет отображаться на экране, так как значение глубины будет меньше или равно 1.
Для большей ясности посетите: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php