В своей записи 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 комментариев:
В бетке 11 флеша (уже не инкубатор) пишет что не поддерживает Molehill API. У stage3D убрали viewPort.
Про бету 11 плеера и его вьюпорт - вестимо. Строку сообщения действительно надо поправить - спасибо.
Да вообще от viewPort избавиться надо, кончился инкубатор, ещё пара беток и релиз )
Не перехожу с инкубатора исключительно потому что жду когда Away3D и Alternativa3D исправятся. Как только они - так и я следом. Перейти-то не долго.
Away3D https://github.com/away3d/away3d-core-fp11
ждем альтернативу
Хотелось бы узнать где можно почитать хорошего качества статью (на английском или русском — неважно) про модели освещения. Чтобы в ней были показаны уравнения для расчета цвета точки на основе параметров источников света. Не подскажите?
К сожалению - нет, не подскажу. Сам черпал информацию из различных книг, в том числе у Борескова. У него на сайте steps3d.narod.ru множество познавательных статей. Можно попытаться погуглить по фразам vertex shader, fragment shader, само собой.
Отправить комментарий