Flash и AGAL: как правильно интерполировать векторы нормалей

Я пытаюсь написать набор шейдеров, чтобы можно было рисовать края поверхностей (не полигонов!), Как в игре Echochrome.

Из того, что я помню по графическому программированию, это можно сделать с помощью многопроходного рендеринга. Первый проход должен кодировать векторы нормали лица и глубины как цвета RGBA и отрисовывать их в текстуре. Второй проход должен искать значения в текстуре и рисовать границу, если информация о нормали или глубине в текущем фрагменте значительно отличается от нормалей или глубин окружающих текселей.

(Примечание. Если есть более простой способ сделать это, сообщите мне, особенно если это легко сделать во Flash. Однако мой конкретный вопрос заключается в следующем.)

Я наткнулся на загвоздку при программировании первого прохода. Из того, что я прочитал в статье Введение в программирование трехмерных игр с помощью DirectX 9.0c: подход шейдера Фрэнка Д. Луны, правильный способ "интерполировать" вектор нормали - это усреднить векторы нормали для вершины треугольника, затем используйте это значение для каждого фрагмента на поверхности. Однако мой фрагментный шейдер вместо этого интерполирует вектор нормали, что приводит к рисованию градиента вместо сплошных цветов для поверхностей.

Как я могу заставить AGAL выполнять необходимое усреднение вместо интерполяции?


person sadakatsu    schedule 06.02.2013    source источник


Ответы (1)


Я думаю, вам нужно будет продублировать свои вершины, чтобы у каждого треугольника были свои три вершины, не общие ни с одним другим треугольником. Нормаль для каждой вершины треугольника должна быть усредненной нормалью: все три нормали для треугольника будут одинаковыми, так что интерполированное значение не изменится. Я знаю, что это не идеально, но у меня нет других решений.

В OpenGL вы можете вычислять усредненные нормали в геометрическом шейдере или использовать квалификатор «flat», чтобы нормали не интерполировались, но я не думаю, что вы можете сделать что-то из этого в AGAL.

См. этот вопрос / ответ для получения дополнительной информации.

person bwroga    schedule 06.02.2013
comment
@gamecoder Я не уверен, что эти ответы (без геометрического шейдера) можно реализовать в AGAL, ​​но я подумал, что вам это может быть интересно. - person bwroga; 20.02.2013