У кого-нибудь есть оптимизированная функция для предварительного умножения растрового изображения на альфа? - PullRequest
2 голосов
/ 17 апреля 2009

Функции наложения GDIPlus используют предварительно умноженный канал rgb альфа-растровыми изображениями для эффективности. Однако предварительное умножение на альфа очень дорого, поскольку каждый пиксель приходится обрабатывать по одному.

Похоже, это был бы хороший кандидат на сборку SSE. Есть ли здесь кто-то, кто хотел бы поделиться его реализацией? Я знаю, что это тяжелая работа, поэтому я и спрашиваю об этом. Я не пытаюсь украсть твою работу. Вы получите все мои соображения за то, что поделились этим, если сможете.

Редактировать: я не пытаюсь делать альфа-смешивание программным обеспечением. Я пытаюсь предварительно умножить каждый компонент цвета каждого пикселя в изображении на его альфа. Я делаю это, потому что альфа-смесь выполняется по формуле: dst = src src.alpha + dst (1-dst.alpha), однако функция AlphaBlend Win32 действительно реализует dst = src + dst (1 -dst.alpha) для оптимизации. Чтобы получить правильный результат, вам нужно, чтобы src был равен src * src.alpha перед вызовом AlphaBlend.

Мне потребовалось бы немного времени, чтобы написать, поскольку я мало что знаю о сборке, поэтому я спрашивал, не хочет ли кто-нибудь рассказать о ее реализации. SSE было бы здорово, так как в статье усиление альфа-смешивания программным обеспечением составляет 300%.

Ответы [ 3 ]

2 голосов
/ 17 апреля 2009

Здесь есть хорошая статья. Он немного староват, но вы можете найти что-то полезное в разделе, где он использует MMX для реализации альфа-смешивания. Это можно легко перевести в инструкции SSE, чтобы использовать преимущества регистров большего размера (128 бит)

Улучшенное альфа-смешивание MMX

Замечания по применению Intel здесь, с исходным кодом

Использование инструкций MMX ™ для реализации альфа-смешивания

0 голосов
/ 17 апреля 2009

Обработка каждого пикселя не требует больших затрат с родным API Win32 GDI.
Смотри MSDN

0 голосов
/ 17 апреля 2009

Возможно, вы захотите взглянуть на библиотеку шаблонов Eigen C ++. Это позволяет использовать код высокого уровня C ++, который использует оптимизированный ассемблер с поддержкой SSE / Altivec.

Быстро. (См. Эталонный тест).
Шаблоны выражений позволяют разумно удалять временные значения и позволяют выполнять ленивую оценку, когда это уместно - Eigen позаботится об этом автоматически и в большинстве случаев также обрабатывает наложение. Явная векторизация выполняется для наборов команд SSE (2 и более поздних) и AltiVec с постепенным отступлением от не векторизованного кода. Шаблоны выражений позволяют выполнять эти оптимизации глобально для целых выражений. В случае объектов фиксированного размера динамическое выделение памяти исключается, и циклы развертываются, когда это имеет смысл. Для больших матриц особое внимание уделяется удобству кэширования.

Elegant. (См. Витрину API).
API чрезвычайно чист и выразителен, благодаря шаблонам выражений. Реализация алгоритма поверх Eigen напоминает просто копирование псевдокода. Вы можете использовать сложные выражения и по-прежнему полагаться на Eigen для получения оптимизированного кода: вам не нужно вручную разбивать выражения на маленькие шаги.

...