среда, 20 июля 2011 г.

Flash3D, Molehill. Шейдер диффузного освещения на AGAL

В своей записи Flash3D, Molehill. Добавляем трехмерный объект я рассказал как добавлять трехмерный объект во Flash-приложение, использующее новый API для работы с ресурсами графического адаптера Molehill. Но объект был раскрашен текстурой без учета освещения. Здесь я расскажу как добавить освещение, пока простое, рассеянное.

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

Для учета освещения нам, безусловно, необходим источник света. Пока не будем учитывать его цвет (предположим он белый), пока только положение. Для этого добавим вектор положения источника света:

private var lightPosition:Vector. = Vector.([-50.0, -100.0, 100.0, 1.0]);

и каждый кадр будем вращать источник по кругу и добавлять в константу вершинного шейдера:

lightPosition[0] = Math.cos( getTimer() * 0.001 ) * 100;
lightPosition[2] = Math.sin( getTimer() * 0.001 ) * 100 + 50;
context3D.setProgramConstantsFromVector(Context3DProgramType.VERTEX,  8, viewPosition);

Также для расчетов нам понадобится модельно-видовая и проекционно-модельно-видовая матрица. Также в модели необходимо вычислить нормали каждой вершины. Всё это мы отправляем в шейдер при каждом рендеринге.

Алгоритм освещения прост. Мы пересчитываем нормали и положения вершин, вычисляем нормированный вектор направления на источник света. Затем находим скалярное произведение нормали и направление на источника света, перемножаем его (ограниченное нулем снизу) и цвет вершины.

Вот код вершинного шейдера диффузного освещения на AGAL:

m44 vt0, va0, vc0
mov op, vt0
mov v0, va1
m44 vt0, va0, vc4 
m44 vt1, va2, vc4 
nrm vt1.xyz, vt1.xyz
mov v1, vt1
sub vt1, vt0.xyz, vc8.xyz
nrm vt1.xyz, vt1.xyz
mov v2, vt1

а вот — фрагментного:

dp3 ft0.xyzw, v2.xyz, v1.xyz
sat ft0, ft0
tex ft1, v0, fs1 <2d,clamp,linear> 
mul ft0, ft1, ft0
mov oc, ft0

Отсюда можно загрузить исходный код примера (*.rar, 4Mb) или здесь посмотреть, нажав на иконку Флеша (помните, что для просмотра должен быть установлен Flash Player 11 Incubator).

6 комментариев:

XProger комментирует...

В бетке 11 флеша (уже не инкубатор) пишет что не поддерживает Molehill API. У stage3D убрали viewPort.

PixeL комментирует...

Про бету 11 плеера и его вьюпорт - вестимо. Строку сообщения действительно надо поправить - спасибо.

XProger комментирует...

Да вообще от viewPort избавиться надо, кончился инкубатор, ещё пара беток и релиз )

PixeL комментирует...

Не перехожу с инкубатора исключительно потому что жду когда Away3D и Alternativa3D исправятся. Как только они - так и я следом. Перейти-то не долго.

XProger комментирует...

Away3D https://github.com/away3d/away3d-core-fp11

PixeL комментирует...

ждем альтернативу

Отправить комментарий