Pull to refresh

Comments 6

Если это перевод, как указано в тегах, то дайте ссылку на оригинал

До glClipControl на десктопах можно было получить reverse depth экзотическим способом. Была такая функция glDepthRangeNV, которая позволяла поменять маппинг. Ну и люди применяли glDepthRangeNV(-1, 1), то есть избавлялись от преобразования [-1;1] -> [0; 1]. Далее просто делаем матрицу проекции как в DirectX, ну и для уверенности выставляем gl_ClipDistance по z, чтобы наверняка отрезать пиксели. Короче получали аналогичное поведение как в DX.
Так вот, эта функция 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 в пролете, да.

С glDepthRange конечно смешно получилось))
Про glDepthRangef не знал, спасибо)

Знаю, что комментарий довольно древний, но благодарю Вас за подсказку с 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)
Жаль комменты невозможно редактировать спустя продолжительное время. На том же YT то можно. В общем не то всё это. Но мне обратная глубина в проекте так-то и не нужна
Sign up to leave a comment.

Articles