Вывод координат из шейдера Cg Vertex - PullRequest
2 голосов
/ 14 ноября 2011

В статье здесь говорится:

Деление x, y и z на w завершает это. Полученные координаты называются нормализованными координатами устройства. Теперь все видно геометрические данные лежат в кубе с позициями между <-1, -1, -1> и <1, 1, 1> в OpenGL и между <-1, -1, 0> и <1, 1, 1> в Direct3D.

Это поднимает проблему для кроссплатформенных шейдеров, которые хотят проверить координату Z по какой-то конкретной причине. Есть ли способ получить координату Z в одном и том же диапазоне независимо от платформы?

Ответы [ 3 ]

1 голос
/ 14 ноября 2011

Интересный вопрос, но я сомневаюсь, что это достижимо, поскольку преобразование области просмотра все еще является фиксированной функцией.

Первое, что приходит на ум, - это использовать glDepthRange (илиего возможный аналог D3D), чтобы изменить отображение с NDC z на глубину.Но это не сработает, поскольку передача [-1,1] в glDepthRange просто ограничит его до [0,1], и вы также не можете установить его в D3D в [0,5,1], так как до этого все будет по-прежнемуобрезать по [0,1].

Но я не думаю, что вам это нужно слишком часто, поскольку в фрагментном / пиксельном шейдере вы получаете координаты окна с нормализованной глубиной [0,1] (я ожидаюCg вести себя похоже на GLSL здесь).А в вершинном шейдере вам все равно чаще нужна будет глубина мира или пространства просмотра, а не NDC z.Если вам это действительно нужно, вы можете просто основать решение на определении препроцессора в шейдере.

1 голос
/ 14 ноября 2011

Использование нелинейного значения z / w пространства NDC обычно избегается.Обычно это делается путем прохождения абсолютного расстояния по вершине Z путем дополнительного варьирования.Таким образом, вещи остаются портативными.

0 голосов
/ 14 ноября 2011

Где вы делаете это тестирование Z, которое вы хотите сделать?

Если вы делаете это в фрагментном шейдере, то вам все равно. gl_FragCoord.z или любой другой эквивалентный Cg находится в пространстве окна. Окно-пространство Z экстента определяется как glDepthRange; по умолчанию оно изменяется от 0 до 1.

Если вы проводите этот тест в вершинном шейдере, вам просто придется с этим жить. Лучшим может быть тест, выполненный в пространстве камеры, а не в пространстве клипа или пространстве NDC. По крайней мере, вы обычно имеете дело с расстояниями мирового масштаба.

...