1 апреля 2011 г.

Flash3D, Molehill. Добавляем трехмерный объект

После того как мы вручную создали плоский треугольник и наложили на него текстуру стоит попробовать загрузить настоящий трехмерный объект. Для простоты решения таким объектом будет модель нашей планеты или попросту шар.

Так как мы будем использовать мощности графической карты, посредством API Molehill, то мы можем загрузить гораздо больше полигонов без ущерба для производительности, чем при использовании софтверного рендеринга. Геометрия в графическую карту загружается с использованием вертексного буфера. В один вертексный буфер API Molehill позволяет добавить максимум 65535 вершин с максимальным числом атрибутов на вершину — 8 (256 байт). Для наших целей этого будет вполне достаточно.

Готовим модель Земли в трехмерном редакторе (Blender 3D, 3ds Max, Maya и т.п.). Текстурируем её там же. Экспортируем в один из доступных форматов и парсим его любым доступным Вам методом. Я выбрал простой формат файла ASE и распарсил его собственным питоновским скриптом. В сети же есть множество готовых решений для подобных манипуляций, например prefab3D. А, например, Blender 3D по слухам позволяет сохранить модель в формате ActionScript 3 непосредственно.

В результате мы должны получить те же числовые векторы (вершинный и индексный), только теперь сгенерированные из подготовленных в трехмерном редакторе моделей (модели). Формат нашей вершины будет x, y, z, u, w. Т. е. первые три атрибута будут содержать геометрические координаты местоположения в пространстве, а последующие два — текстурные координаты. К слову сказать, в случае с текстурированием шара мы можем вычислить текстурные координаты прямо в шейдере, но не будем этого делать. По крайней мере пока.

Загружаем вершинный и индексный буфер в видеокарту:

// Создаем вершинный буфер в формате (x, y, z, u, w)
vertexData = Vector.(EarthMidVertexBuffer);
vertexBuffer = context3D.createVertexBuffer(vertexData.length / 5, 5);
vertexBuffer.uploadFromVector(vertexData, 0, vertexData.length / 5);

// Создаем индексный буфер
indexData = Vector.(EarthMidIndexBuffer);
indexBuffer = context3D.createIndexBuffer(indexData.length);
indexBuffer.uploadFromVector(indexData, 0, indexData.length);

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

Единственное, что мы изменим — увеличим размер текстуры до 1024 пикселей по стороне, потому как ресурсы видеокарт поддерживающих шейдеры 2 версии это позволяют.

// Загружаем нашу текстуру
texture = context3D.createTexture(1024, 1024, Context3DTextureFormat.BGRA, false);
var bitmap:Bitmap = new EarthBitmap();
texture.uploadFromBitmapData(bitmap.bitmapData);

На этом пока всё. Здесь можно загрузить исходный код, а здесь классы утилит от компании Adobe для функционирования примера.

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

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

Привет! Я программирую трёхмерную графику с использованием Альтернативы, есть бэкграунд в OpenGL (на С++).

Хотел узнать, есть ли где-то полноценная документация по Molehill? Или это тотальный секрет? Очень хочется поиграться с шейдерами, а WebGL или создание для этого адового приложения на С++ не интересно. ))

Спасибо за ответ!

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

v_ignatyev, дело в том, что Molehill еще не релизнулся. Это бета-версия, предназначенная для знакомства и тестирования. С релизом 11 версии флеш-плеера (вроде как в этом году, в 3 квартале?) будет и полноценная документация и программа для высокоуровневой работы с шейдерами (Pixel Bender3D). А сейчас, насколько я знаю, все довольствуются тем, что есть в пре-документации API Molehill в описании класса flash.display3D.Program3D (внизу страницы). Еще, если скачать бетку Pixel Bender3D, там тоже есть документация, в ней много инфы.

И еще. AGAL очень похож на низкоуровневые реализации в OGL и DX. При достаточных знаниях OGL или DX с AGAL трудностей быть не должно.

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

Круто! Спасибо за разъяснения :-)
Хороших проектов тебе!

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

Совершенно не за что :)

Роман комментирует...

http://matthewfabb.com/fp11incubator27_02_11/flash/display3D/Context3D.html

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