Comments 6
Если это перевод, как указано в тегах, то дайте ссылку на оригинал
+3
До glClipControl на десктопах можно было получить reverse depth экзотическим способом. Была такая функция glDepthRangeNV, которая позволяла поменять маппинг. Ну и люди применяли glDepthRangeNV(-1, 1), то есть избавлялись от преобразования [-1;1] -> [0; 1]. Далее просто делаем матрицу проекции как в DirectX, ну и для уверенности выставляем gl_ClipDistance по z, чтобы наверняка отрезать пиксели. Короче получали аналогичное поведение как в DX.
Так вот, эта функция glDepthRangeNV посути только для reverse depth техники, и фактически использовалась только с аргументнами glDepthRangeNV(-1, 1). И кроносы решили её узаконить, и внести в «ядро». Так родилась функция glDepthRange. Но кто-то видимо решил, что он уменее всех, и у функции появилась новая фича:
И range на который клампались значения функции были [0;1]. Понимаете иронию? Единственная вещь, ради которой использовали glDepthRangeNV — оказалсь невозможна в glDepthRange. В результате после длительной паузы появилась glDepthRangef, которая подобной дурью не обладала, и reverse depth уже можно делать с помощью glDepthRangef. А позже и glClipControl завезли.
Так вот, glDepthRangef есть и на мобилках начиная с ES 2.0. Так что поидее reverse depth там уже можно провернуть (но я на мобилках это не пробовал). А вот WebGL в пролете, да.
Так вот, эта функция glDepthRangeNV посути только для reverse depth техники, и фактически использовалась только с аргументнами glDepthRangeNV(-1, 1). И кроносы решили её узаконить, и внести в «ядро». Так родилась функция glDepthRange. Но кто-то видимо решил, что он уменее всех, и у функции появилась новая фича:
Thus, the values accepted by glDepthRange are both clamped to this range before they are accepted.
И range на который клампались значения функции были [0;1]. Понимаете иронию? Единственная вещь, ради которой использовали glDepthRangeNV — оказалсь невозможна в glDepthRange. В результате после длительной паузы появилась glDepthRangef, которая подобной дурью не обладала, и reverse depth уже можно делать с помощью glDepthRangef. А позже и glClipControl завезли.
Так вот, glDepthRangef есть и на мобилках начиная с ES 2.0. Так что поидее reverse depth там уже можно провернуть (но я на мобилках это не пробовал). А вот WebGL в пролете, да.
+4
С glDepthRange конечно смешно получилось))
Про glDepthRangef не знал, спасибо)
0
Знаю, что комментарий довольно древний, но благодарю Вас за подсказку с Reverse-Z через glDepthRangef. Только ещё пришлось изменить код, добавив пару #define, чтобы проверка глубины работала как надо. Сам проект, где используется сейчас Reverse-Z, использует OpenGL 4.3, где glClipControl нет.
#define glDepthFuncReverse(func) \
switch(func) { \
case GL_LESS: \
glDepthFunc(GL_GREATER); \
break; \
case GL_LEQUAL: \
glDepthFunc(GL_GEQUAL); \
break; \
case GL_GREATER: \
glDepthFunc(GL_LESS); \
break; \
case GL_GEQUAL: \
glDepthFunc(GL_LEQUAL); \
break; \
default: \
glDepthFunc(func); \
break; \
}
#define glClearDepthfReverse(d) \
glClearDepthf(1.0f - d); \
glDepthRangef(1.0f, 0.0f)
0
Sign up to leave a comment.
Точность depth наглядно