Как стать автором
Обновить

Комментарии 12

Грамотно :) Вехой будет Unreal 1 в software mode на мобильнике
Спасибо огромное, прям ну очень в тему легло!
Как раз сейчас сижу и вывод 16 бит графики оптимизирую, в т.ч. и с альфа-каналом.
Тогда рекомендую опробовать оба способа. На некоторых устройствах способ с двумя умножениями на пиксель показывал чуть большую производительность. ;)
Да, конечно. Я еще и с ассемблером поэкспериментирую.
У меня еще и источник premultiplied в большинстве случаев. Но, главное, информация к размышлению есть.
Теперь понятно почему в моей NVideo Riva TNT2 ускорение работало только в 16-битном режиме
Это неправда. Ускорение там работает и в 32-битном режиме. Не смешивайте теплое и мягкое и учите матчасть.
>> oddA = (a<<22) | (a<<11) | (a);
А зачем вы двигаете 2 компонента, если достаточно подвинуть только G?
протупил =)
На всякий случай распишу подробнее:

[RRRR RGGG GGGB BBBB RRRR RGGG GGGB BBBB] = P // 2 пикселя
[0000 0111 1110 0000 1111 1000 0001 1111] = 0x07E0F81F
[0000 0GGG GGG0 0000 RRRR R000 000B BBBB] = P & 0x07E0F81F = P' // выделяем нечетные компоненты

[A AAAA] = a // коэффициент прозрачности состоит из 5-ти бит

[0000 0AAA AA00 0000 AAAA A000 000A AAAA] = oddA // выравниваем α по нечетным компонентам
[GGGG GGGG GGGR RRRR RRRR R0BB BBBB BBBB] = P' * oddA // после умножения компоненты начинают занимать выделенные пространства
[0000 0GGG GGGG GGGG RRRR RRRR RR0B BBBB] = P' * oddA >> 5 = P" // выравниваем полученные значения
[0000 0GGG GGG0 0000 RRRR R000 000B BBBB] = P" & 0x07E0F81F // очищаем место для вставки четных компонент
Меня одолевает непреодолимое чувство фейспалма,
не только потому что я проглядел по диагонали вашу статью, но
и что я сам такое же делал на GBA в своё время =)

Слова о 2х умножениях на пиксел, не иначе как под воздействием космических лучей, у меня в голове резюмировались примерно следующим образом

ldrh C1, [src, #0]
ldrh C2, [dst, #0]

or ps, C1, C1, LSL #16; ?G?R?B
and ps, ps, mask_G_R_B; 0G0R0B
or pd, C2, C2, LSL #16
and pd, pd, mask_G_R_B

mul ps, ps, alpha ;fast 32х8 bit mul
mla ps, pd, inv_alpha, ps

and ps, mask_G_R_B, ps, LSR #5
or ps, ps, LSR #16

strh ps, [dst, #0]
Спасибо за статью, многим новичкам будет полезно. Однако алгоритм, озвученный здесь не является чем-то новым, все всегда так и кодили демки для svga-режимов. Подробнее есть в demo design faq от лохматого года.
Да, все уже написано до нас:)
Просто хотелось показать путь размышлений, как можно прийти к этому алгоритму.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории