История изменений
Исправление SZT, (текущая версия) :
Хотя да, там я что-то затупил, ведь задача какая, на каждое RGBA умножать R G B A на одно значение, следующие 4 штуки RGBA же надо умнодать уже на что-то другое. Собственно, что тут можно придумать? Вот это 0xRRGGBBAA - 32 bit. Надо б сделать скажем такую штуку 0x000000RR000000АА - и потом умножить на filterVal. Ну т.е. фактически берем 0xRRGGBBAA расширяем до 64 бит 0x00000000RRGGBBAA и потом делаем маску 0x00000000FF000000 и сдвигаем влево на 8 бит -> 0x000000RR00000000. Ну и потом туда добавляем по маске 0xFF кусочек от альфа канала. Вот так и получится 0x000000RR000000АА который можно умножить на filterVal. Тут вот еще что - умножение 16-битного на 8-битное занимать будет максимум 24 бита, и тогда можно еще simd-ом пытаться что-то поскладывать, ведь там еще есть целых 8 бит про запас, но ситуацию портит то, что используется signed и в результате может быть отрицательное значение, что все испортит. В общем можно еще повозиться и что-нибудь попробовать придумать, например для отрицательных и положительных filterVal писать отдельное суммирование, но мне кажется что оно только затормозится сильнее от такого
Исходная версия SZT, :
Хотя да, там я что-то затупил, ведь задача какая, на каждое RGBA умножать R G B A на одно значение, следующие 4 штуки RGBA же надо умнодать уже на что-то другое. Собственно, что тут можно придумать? Вот это 0xRRGGBBAA - 32 bit. Надо б сделать скажем такую штуку 0x000000RR000000АА - и потом умножить на filterVal. Ну т.е. фактически берем 0xRRGGBBAA знакорасширяем до 64 бит 0x00000000RRGGBBAA и потом делаем маску 0x00000000FF000000 и сдвигаем влево на 8 бит -> 0x000000RR00000000. Ну и потом туда добавляем по маске 0xFF кусочек от альфа канала. Вот так и получится 0x000000RR000000АА который можно умножить на filterVal. Тут вот еще что - умножение 16-битного на 8-битное занимать будет максимум 24 бита, и тогда можно еще simd-ом пытаться что-то поскладывать, ведь там еще есть целых 8 бит про запас, но ситуацию портит то, что используется signed и в результате может быть отрицательное значение, что все испортит. В общем можно еще повозиться и что-нибудь попробовать придумать, например для отрицательных и положительных filterVal писать отдельное суммирование, но мне кажется что оно только затормозится сильнее от такого