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 перед выполнением любых вычислений положения экрана, теперь оно работает безупречно. Я не уверен, является ли это программной или аппаратной проблемой на моей стороне, или если это найдено в другом месте, но по крайней мере это работает!

Другие вопросы по тегам