ближние/дальние плоскости и z в ортогональной растеризации

Я написал тонны шейдеров, но наткнулся на то, чего раньше не осознавал.

Мне нужен был вершинно-фрагментный шейдер с простой ортогональной проекцией, без проверки глубины.

Камера выровнена по оси Z относительно исходной точки.

Я отключил GL_DEPTH_TEST, и пишет маскированная глубина. На самом деле это было так просто, что я решил, что мне даже не нужна проекционная матрица. По своему полному невежеству и сообразительности я думал, что для любой вершины треугольника вершинный шейдер просто передаст x,y(,z = <whatever>,w = 1) фрагментному шейдеру.

На самом деле я думал, что фрагментному шейдеру потребуются только координаты x, y, потому что, поскольку мы говорим об ортогональной проекции, w = 1 (без перспективного деления), и поскольку буфер глубины бесполезен, а запись глубины отключена, z может буквально быть < em>что угодно, не имеет значения.

Конечно, я был неправ. Я быстро обнаружил, что компонент z довольно часто используется растеризатором, на самом деле у меня есть тонны треугольников, которые просто не растеризуются.

Я также обнаружил, что настройка компонента z резко меняет визуализируемые треугольники. Поэтому я реализовал обычную матрицу орфографической проекции, и это, конечно же, решило проблему, теперь все правильно растеризовано.

Теперь из чистого любопытства я начал играть с матрицей ортогональной проекции и посмотреть, что на самом деле получается для разных входных векторов с разными значениями для ближней и дальней плоскостей отсечения, и я действительно не могу понять. Хорошо, x, y и w все, как и ожидалось, но я получаю совершенно разные значения z на основе моих ближних/дальних плоскостей отсечения.

Вопрос в следующем: фрагментный шейдер ничего не знает о плоскостях отсечения и матрицах проекций, он просто получает кучу x,y,z,w... какова роль компонента z в процессе растеризации? как он узнает, находится ли что-то внутри усеченного конуса обзора или нет?

Я имею в виду, что для любой данной ближней/дальней плоскости в матрице ортогональной проекции я получаю значения z, которые действительны для данной матрицы проекции и недействительны для других. Поскольку фрагментный шейдер не может знать, какие плоскости использовались в матрице, как он может отбрасывать фрагменты? Есть ли связь между каждой вершиной одного и того же примитива?

PS: я знаю, что фрагментный шейдер даже не вызывается, так как я настроил SSBO + Atomic Counter и проверил, что оба они не изменились.


person user815129    schedule 26.10.2015    source источник
comment
Растеризация выполняется перед этапом фрагментного шейдера — это то, что фактически генерирует фрагменты. Znear/Zfar выравнивает ваши минимальные/максимальные значения, чтобы они соответствовали z=1 и z=-1 в пространстве клипа. Просто обрежьте все, что не помещается в единичный куб (в пространстве отсечения - после проекции и перспективного деления), и все в порядке.   -  person keltar    schedule 26.10.2015
comment
Какова ваша результирующая матрица? Почему твой Зфар больше, чем Знеар? Ось Z идет от глубины к камере в opengl. Быстрый расчет на бумаге дает мне ~ 0.7317 для z=300 и данных znear/zfar (конечно, инвертированных).   -  person keltar    schedule 26.10.2015
comment
вы правы.. я удалил свой предыдущий неверный пример, я все пересчитал, и у меня была ошибка знака.. вы правы.. он просто масштабирует все от -1 до +1, если внутри frustrum .. если вы опубликуете ответ, я его приму. Спасибо.   -  person user815129    schedule 26.10.2015


Ответы (1)


Вершинный шейдер преобразует вершины из локальной системы координат модели в пространство отсечения. Если ваши координаты превышают единичный куб после деления перспективы (куб с размерами [-1;1] для каждого измерения или [-W;W] до деления), то эти фрагменты будут обрезаны.

Если вы не заботитесь о Z и действительно не хотите устанавливать правильную орто-проекцию (например, вы не знаете диапазон значений Z и, следовательно, не можете установить соответствующие плоскости отсечения), вы можете исправить Z в вершинном шейдере, зажав его до ( -W;W) диапазон (или просто установка его 0).

person keltar    schedule 26.10.2015