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.

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

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

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

Иван комментирует...

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

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

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

Иван комментирует...

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

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

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

Иван комментирует...

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

Владимир Игнатьев комментирует...

Хотелось бы узнать где можно почитать хорошего качества статью (на английском или русском — неважно) про модели освещения. Чтобы в ней были показаны уравнения для расчета цвета точки на основе параметров источников света. Не подскажите?

Иван комментирует...

К сожалению - нет, не подскажу. Сам черпал информацию из различных книг, в том числе у Борескова. У него на сайте steps3d.narod.ru множество познавательных статей. Можно попытаться погуглить по фразам vertex shader, fragment shader, само собой.

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