21 марта 2011 г.

Простой шейдер для двухмерной текстуры на AGAL

Давайте продолжим наши исследования шейдеров на AGAL для бета-версии Flash Player 11 с API Molehill, которое я начал несколько ранее. Здесь мы разберем вопрос о том, что потребуется сделать, если мы захотим, чтобы наш треугольник был раскрашен пикселями растрового изображения.


Для того, чтобы шейдеры отображали текстуры на треугольниках необходимо обеспечить доступ графического процессора до растровых данных. Для этого мы берем изображение 256 на 256 пикселей в формате png-24 и внедряем в наш мувик, посредством инструкции:

[Embed(source="../res/stars.png")]
private var StarsBitmap:Class;

Замечу, что данное решение предназначено для Flex SDK, не знаю как это будет работать во Flash IDE или Flex Builder'е, но подозреваю, что как-то так же. Еще отметим про себя, что текстура должна содержать равное количество пикселей по сторонам кратное степени 2 и числом до 256. Это ограничение существует из-за желания Adobe поддерживать бОльшее количество карт. Далее мы готовим растровые данные для загрузки в шейдер:

texture = context3D.createTexture(256, 256, Context3DTextureFormat.BGRA, false);
var bitmap:Bitmap = new StarsBitmap();
texture.uploadFromBitmapData(bitmap.bitmapData);

Также будем помнить, что без текстурных координат система не будет знать как растеризовать текстуру. Для этого мы добавим текстурные координаты в наш vertexData:

vertexData = Vector.([
     .866, -.5, 0, 1, 0, 0, 0, 1, // red
     0,      1, 0, 0, 1, 0, 1, 0, // green
    -.866, -.5, 0, 0, 0, 1, 1, 1  // blue
]);

Остался сущий пустяк - передать текстурные координаты в контекст:

context3D.setVertexBufferAt(1, vertexBuffer, 6, Context3DVertexBufferFormat.FLOAT_2);

и туда же передать идентификатор текстуры:

context3D.setTextureAt(1, texture);

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

4 комментария:

Анонимный комментирует...

Про mipmap'ы умолчал )

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

У, я много про что умолчал :). Может когда-нибудь про всё напишу :).

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

Я не знаю где толком спросить, есть проблема, если в альтернативе 8 использовать альфу то листья лезут друг по перед руга и никак не сортируются, это проблема моленхила или всетаки альтернативы, если написать свой шейдер с альфой то будет тоже самое или можно както избежать. Проблема поднята тут http://forum.alternativaplatform.com/posts/list/8659.page
буду оченьь благодарен за ваше мнение по дааному вопросу

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

"I found that this is not a bug but this is inherent to the way the graphic card handle sorting, it uses z-buffer sorting which is not compatible with alpha blending."

Как-то так, видимо...

Но решить, очевидно, можно. Сейчас, к сожалению, совершенно нет времени на подобные изыскания :(.

Одно могу сказать определенно, с подобной проблемой сталкивался и на то время её ещё не решил.

Поищите решение для OpenGL'евских шейдеров, например (GLSL). Наверняка найдете. И примените методику для AGAL. Ничего невозможного нет.

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