Zbuffer правила для gl_Position - PullRequest
4 голосов
/ 17 июня 2011

Вот мои настройки для opengl, если они имеют значение:

glViewport(0,0,w,h); //w=800, h=600
glShadeModel(GL_SMOOTH);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
glClearDepth(1.0f);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);

Некоторое время я думал, что плоскости отсечения будут применяться ко всему, для чего gl_Position.z находится за пределами -1 к 1. Но даже когда я заставляю gl_Position.z к постоянному числу в шейдере:

gl_Position.z = -0.01;

Все еще есть правильная z-буферизация и отсечение на основе gl_Position.w! Так каковы правила?

Ответы [ 2 ]

9 голосов
/ 17 июня 2011

Значение gl_Position находится в том, что OpenGL называет «пространство клипа».Это однородная система координат .В частности, экстентами XYZ пространства клипа являются [-W, + W].Таким образом, каждая вершина находится в своем собственном пространстве клипа.

Я не совсем точно понимаю, что вы подразумеваете под «каковы правила».Клип-пространство gl_Position отсекается от области просмотра в однородном пространстве.Таким образом, они обрезаются в области [-W, + W] для каждой вершины.Трудно представить, что в проективном однородном пространстве, но математика работает, так что это не имеет значения.

После этого обрезанные вершины преобразуются в нормализованное пространство координат устройства (NDC).Это означает деление XYZ пространства клипа на W. Все эти вершины находятся в диапазоне [-1, 1].

Оттуда происходит преобразование области просмотра.Параметры glViewport масштабируют вершины из пространства [-1, 1] NDC в область области просмотра.Это преобразует точки в пространство окна;именно в пространстве окна они растеризуются.

XY пространства окна управляется glViewport.Значения Z для пространства окна контролируются glDepthRange.Диапазон глубины по умолчанию - это близкое значение 0 и дальнее значение 1 (ВНИМАНИЕ: матрица перспективы вблизи / в дальних плоскостях не имеет ничего общего с с диапазоном глубины. Не путайте их).Таким образом, он отображает [-1, 1] Z в пространстве NDC на [почти, далеко] в пространстве окна.

Это «правила».

0 голосов
/ 17 июня 2011

Вы используете glClearDepth (1.0f); glEnable (GL_DEPTH_TEST); glDepthFunc (GL_LEQUAL); * * 1 001

Буфер глубины имеет значение от 0 до 1 (максимальная глубина), используйте выбрано GL_LEQUAL, что означает, что все будет отображаться на экране, так как значение глубины будет меньше или равно 1.

Для большей ясности посетите: http://www.zeuscmd.com/tutorials/opengl/11-Depth.php

...