Тема № 2: Работа со спрайтами.
Тут все просто. Создаем текстурку, грузим из файла и рисуем.Кода соответственно добавится с предыдущего раза немного
var
Logo: IQuadTexture;
...
QuadDevice.CreateTexture(Logo);
Logo.LoadFromFile(0, PAnsiChar('data/logo.png'));
...
Logo.DrawRot(X, Y, Angle, Scale, Color);
Для правильной отрисовки полупрозрачных спрайтов нужно поставить правильный режим смешивания:
Quad.SetBlendMode(qbmSrcAlpha);
Пример
Спрайты рисуются в обычной экранной системе координат с попиксельной точностью:
В один текстурный ресурс может быть загружено несколько изображений (в коде стоит индекс 0, но могут быть соответственно другие номера).
Это сделано специально, чтобы с помощью шейдеров использовать несколько карт(нормали, отражения, свечения и т.д) на одном спрайте.
Кроме того, текстура может быть атласом с изображениями фиксированного размера. Если при загрузке указать размеры этих изображений, движок автоматически их разобъёт и в последствии их можно будет вызывать по номерам. Например для анимации.
Logo.DrawFrame(X, Y, Pattern, Color);Существует, несколько способов рисования.
Обычный способ, с пиксельной точностью от верхнего левого угла:
Logo.Draw(X, Y, Color);
//для текстур в атласе, Pattern - номер фрагмента
Logo.DrawFrame(X, Y, Pattern, Color);
С вращением и масштабированием, точка отсчета(координаты спрайта) находится в центре:
Logo.DrawRot(X, Y, Angle, Scale, Color);
Logo.DrawRotFrame(X, Y, Angle, Scale, Pattern, Color);
С вращением вокруг произвольной точки:
Logo.DrawRotAxis(X, Y, Angle, Scale, CenterX, CenterY, Color);
Logo.DrawRotAxisFrame(X, Y, Angle, Scale, CenterX, CenterY, Pattern, Color);
Ай молодца!
ОтветитьУдалитьА можно ли отрисовать .tga с альфаканалом?
ОтветитьУдалитьПробовал так:
//tex: IQuadTexture
tex := Engine.CreateAndLoadTexture(0, pchar('sprite.tga'));
...
//Engine: IQuadRender
Engine.SetBlendMode(qbmSrcAlpha);
tex.Draw(10, 10, $FFFFFF);
В таком случае не рисуется ничего, а если не задавать режим блендинга, то спрайт рисуется, но без учета альфаканала.
Должно рисоваться при условии наличии альфы в тга. Возможно в ней попросту нет альфы. Последние версии photoshop например не сохраняют альфу в тга правильно, это нужно делать через добавление и рисование вручную альфаканала.
ОтветитьУдалитьВообще используйте png. Он бесплатный, жмет лучше, альфу тоже держит хорошо. Не вижу особого смысла в tga, если честно.
Странно, альфаканал точно есть, добавлял и рисовал его вручную :) но картинка с qbmSrcAlpha не выводится
ОтветитьУдалитьВот примерчик https://docs.google.com/open?id=0B1VXsnlK-6IfZ05rV21RQk1WWDg. Альфа задана черно белым в режиме каналов(вторая вкладка рядом со слоями). Сама картинка сохранена 32 битным TGA. Альфа прекрасно работает. Пользуйтесь пнг и гимпом:)
ОтветитьУдалитьВот за демку спасибо огромное. Как оказалось, не учел, что при отрисовке спрайта цвет задается четыремя байтами и альфа нулевой была :)
ОтветитьУдалитьПобольше б демок с исходниками, можно с минимумом комментариев
будет
ОтветитьУдалитьА это уже используется версия 0.4 ?
ОтветитьУдалитьИ еще вопрос по "В один текстурный ресурс может быть загружено несколько изображений (в коде стоит индекс 0, но могут быть соответственно другие номера)." А можно ли и как потом вывести на экран изображение под определенным номером (имеется в виду именно этот индекс, а не pattern)? И, если это используется редко, может лучше сместить этот индекс в LoadFromFile с первого места и сделать дефолтным нулем?
Да.
ОтветитьУдалитьНет, в регистры сейчас можно только загружать и делать рендер в текстуру. Это сделано только для шейдеров. Но ваша идея обсуждается и планируется к реализации. То же самое касательно второго вопроса.
Ну мне даже добавить-то и нечего, все так и есть. Идея здравая и коли движок в 0.4 и так немного изменился в архитектуре, то можно до кучи и этот параметр в конец сместить.
ОтветитьУдалитьСпасибо за любопытный фидбек.