AGAL: вычисление положения экрана на экране в фрагментном шейдере
Прежде чем я определю свою проблему более подробно, я думаю, что я должен начать с объяснения того, как я все настроил.
По сути, у меня есть простая плоская сетка, определенная так (x, y, z, u, v):
_vertices = Vector.<Number>([
-1, -1, 0, 0, 0,
1, -1, 0, 1, 0,
1, 1, 0, 1, 1,
-1, 1, 0, 0, 1
]);
_indices = Vector.<uint>([
0, 2, 1,
0, 3, 2
]);
Ничего необычного здесь не происходит. Но то, как я это представляю, это то, где все падает. Это делается с использованием двух проходов рендеринга; Первый - это простой фрагментный шейдер, который просто копирует цвет на выход и рендерится в текстуру 512x512. Тем не менее, все работает нормально. Это во втором проходе рендера моя проблема лежит.
Второй и последний проход рендеринга визуализирует ту же геометрию, но цвет фрагмента (пикселя) должен быть выбран из текстуры, визуализированной первым проходом. И вот тут-то и возникает моя проблема: мне нужен способ правильно рассчитать положение текущего пикселя в координатах экранного пространства или координаты UV, чтобы быть точными, чтобы правильно извлечь их из текстуры.
Я провел некоторые исследования о том, как рассчитать эту позицию, но кое-как я в итоге создал эффект, похожий на калейдоскоп. Этот эффект, однако, проявляется только при вращении сетки по оси X или Z, но не по оси Y, как показано здесь
Программа фрагмента, используемая для второго прохода, та, которая создает этот эффект, выглядит следующим образом
div ft0.x, v0.x, v0.w // Divide vertex positions (v0.xy) with clip-space position (v0.w)
div ft0.y, v0.y, v0.w // to obtain screen coordinates as -1,1
mul ft0.x, ft0.x, fc0.x // Multiply positions (ft0.xy) by 0.5 (fc0.x)
mul ft0.y, ft0.y, fc0.x
add ft0.x, ft0.x, fc0.x // Finally add 0.5 (fc0.x) to positions (ft0.xy)
add ft0.y, ft0.y, fc0.x
tex ft1, ft0.xy, fs0 <2d, nearest, repeat, nomip> // Simply copy the pixel at (ft0) from the render buffer (fs0)
mov oc, ft1";
В заключение, я совершенно новичок во всем этом. Так что я могу упустить что-то очевидное и поэтому заранее прошу прощения.
И если вы хотите взглянуть на код во всей его несуществующей красоте, репозиторий Github можно найти здесь.
1 ответ
Используя PIX, я обнаружил, что позиция Y, передаваемая фрагментному шейдеру, была инвертирована по сравнению с обычными координатами Flash. Так, что верхняя часть экрана равна 1, а нижняя - -1, а не наоборот. Просто отрицая значение Y перед выполнением любых вычислений положения экрана, теперь оно работает безупречно. Я не уверен, является ли это программной или аппаратной проблемой на моей стороне, или если это найдено в другом месте, но по крайней мере это работает!