Вопрос

Вот мои настройки для 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top