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 можно найти здесь< /а>.


person stalem    schedule 07.05.2013    source источник


Ответы (1)


Используя PIX, я обнаружил, что позиция Y, которая передавалась фрагментному шейдеру, была инвертирована по сравнению с обычными координатами Flash. Так что верх экрана равен 1, а низ равен -1, а не наоборот. Простое отрицание значения Y перед выполнением каких-либо вычислений положения экрана теперь работает безупречно. Я не уверен, является ли это программной или аппаратной проблемой на моей стороне, или это можно найти где-то еще, но, по крайней мере, это работает!

person stalem    schedule 09.05.2013