Прежде чем я более подробно опишу свою проблему, я думаю, что должен начать с объяснения того, как я все настроил.
По сути, у меня есть простая плоская сетка, определенная как таковая (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 можно найти здесь< /а>.