Комментарии 12
Грамотно :) Вехой будет Unreal 1 в software mode на мобильнике
+1
Спасибо огромное, прям ну очень в тему легло!
Как раз сейчас сижу и вывод 16 бит графики оптимизирую, в т.ч. и с альфа-каналом.
Как раз сейчас сижу и вывод 16 бит графики оптимизирую, в т.ч. и с альфа-каналом.
+1
Тогда рекомендую опробовать оба способа. На некоторых устройствах способ с двумя умножениями на пиксель показывал чуть большую производительность. ;)
0
Да, конечно. Я еще и с ассемблером поэкспериментирую.
У меня еще и источник premultiplied в большинстве случаев. Но, главное, информация к размышлению есть.
У меня еще и источник premultiplied в большинстве случаев. Но, главное, информация к размышлению есть.
0
Теперь понятно почему в моей NVideo Riva TNT2 ускорение работало только в 16-битном режиме
-1
>> oddA = (a<<22) | (a<<11) | (a);
А зачем вы двигаете 2 компонента, если достаточно подвинуть только G?
А зачем вы двигаете 2 компонента, если достаточно подвинуть только G?
0
протупил =)
0
На всякий случай распишу подробнее:
[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 // очищаем место для вставки четных компонент
+2
Меня одолевает непреодолимое чувство фейспалма,
не только потому что я проглядел по диагонали вашу статью, но
и что я сам такое же делал на 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]
не только потому что я проглядел по диагонали вашу статью, но
и что я сам такое же делал на 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]
+2
Спасибо за статью, многим новичкам будет полезно. Однако алгоритм, озвученный здесь не является чем-то новым, все всегда так и кодили демки для svga-режимов. Подробнее есть в demo design faq от лохматого года.
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Alpha-blending за одно умножение на пиксель на Windows Mobile