Я написал тонны шейдеров, но наткнулся на то, чего раньше не осознавал.
Мне нужен был вершинно-фрагментный шейдер с простой ортогональной проекцией, без проверки глубины.
Камера выровнена по оси 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 и проверил, что оба они не изменились.
0.7317
для z=300 и данных znear/zfar (конечно, инвертированных). - person keltar   schedule 26.10.2015