Форум программистов, компьютерный форум CyberForum.ru

Артефакты при компрессии RGB->DXT5 - C++

Восстановить пароль Регистрация
 
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
23.07.2013, 16:15     Артефакты при компрессии RGB->DXT5 #1
Есть сборник алгоритмов компрессии из RGB в DXT1/DXT5. Тыц:
http://http://www.cauldron.sk/files/extreme_dxt_compression.pdf
Я беру картинку в RGB формате и конвертирую ее в формат DXT1, вывожу на экран и все отлично.
Беру ту же картинку, конвертирую в DXT5, вывожу на экран и получаю артефакты. Собственно артефакты это желтые квадратики. Причем они могут быть любым цветом, появляться в любом месте. Иногда их вообще нет, иногда в хаотическом порядке. Вот. Собственно эту картиночку я натягиваю на сферу. Рисую директхом. що це таке товариші?
Миниатюры
Артефакты при компрессии RGB->DXT5  
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 16:15     Артефакты при компрессии RGB->DXT5
Посмотрите здесь:

RGB C++
программа на С++ для компрессии/декомпрессии файлов C++
C++ как вытянуть RGB из COLORREF?
C++ Graphics: YUV -> RGB conversion
C++ RGB компоненты изображения
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
23.07.2013, 16:39     Артефакты при компрессии RGB->DXT5 #2
Ну вы же занимаетесь цветовой компрессией. Чего же ви хочите от нее?
Возможно скажу очевидную вещь, но попробуйте поиграться с коэффициентами.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
24.07.2013, 06:40  [ТС]     Артефакты при компрессии RGB->DXT5 #3
Очень странно. От случая к случаю на одних и тех же входных данных я иногда наблюдаю артефакты иногда нет. Алгоритм должен выдавать на одних и тех же данных один и тот же ответ всегда. Или я ошибаюсь? Это было бы очень странно. При этом повторюсь, DXT1 дает ВСЕГДА правильную картинку без артефактов.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
24.07.2013, 10:08     Артефакты при компрессии RGB->DXT5 #4
Как можно понять из описания, у DXT5, в отличие от DXT1, есть обработка альфа канала. DXT1 же:
The DXT1 compression creates correct results regard less of the alpha information in the source texture and never outputs transparent pixels
Цитата Сообщение от Kukurudza Посмотреть сообщение
Алгоритм должен выдавать на одних и тех же данных один и тот же ответ всегда.
Не факт. Алгоритм же допускает приближенные значения. Он работает с усредненными величинами. В том его и суть. То есть он
1) берет пару, каждая из четырех пикселей (всего восемь, но преобразование производится над группой из четырех)
2) вычисляет среди каждой четверки максимальные и минимальные значения для каждого цвета (и альфа канала)
3) находит разницу максимального и минимального значения каждого цвета
4) смещает (относительно своего же адресного пространства каждого пикселя как я понял) в соответствии с маской полученные значения, формируя тем самым DXT блок
5) сохраняет (тупо накладывает в одно все полученные, смещенные значения) готовый DXT блок из восьми пикселей
6) подготавливает делители в соответствии с диапазоном (вероятно вычисляет на сколько нужно сместить каждый полученный блок, чтобы можно было составить из них обратно изображение такого же размера как и было)
7) делит
8) формирует блок и сохраняет во временный буфер
9) формирует самый последний, уже настоящий, законченный, готовый DXT блок.

В пункте 5 уже начинается расхождение DXT1 с DXT5 - у промежуточного блока DXT5 в два раза больше информации (он в два раза больше), нежели блок DXT1, за счет учитывания альфа канала. А в пункте 2 идет вычисление самих значений, с которыми работает пункт 5. Следовательно надо искать косяк где-то в этих преобразовании. Я думаю. Но вообще в ассемблере не силен, поэтому детальнее подсказать не могу.
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
24.07.2013, 10:19  [ТС]     Артефакты при компрессии RGB->DXT5 #5
решилась проблема. библиотека эта нифига не threadsafe. есть там массивчики общие, я мурзилку тоже ассемблерную не знаю. видимо где то они меняются по ходу компрессии из разных потоков.
в смысле я сам из нескольких поток вызываю функции компрессии.
SatanaXIII
Супер-модератор
Эксперт С++
 Аватар для SatanaXIII
5549 / 2563 / 233
Регистрация: 01.11.2011
Сообщений: 6,337
Завершенные тесты: 1
24.07.2013, 10:23     Артефакты при компрессии RGB->DXT5 #6
А. А если для DXT5 из одного потока вызывать, то все в порядке, да?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2013, 11:05     Артефакты при компрессии RGB->DXT5
Еще ссылки по теме:

C++ JPEG -> ARGB -> DXT5
Получить цвет пикселя в RGB C++
C++ RGB

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Kukurudza
105 / 86 / 6
Регистрация: 29.08.2012
Сообщений: 539
24.07.2013, 11:05  [ТС]     Артефакты при компрессии RGB->DXT5 #7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А. А если для DXT5 из одного потока вызывать, то все в порядке, да?
верно. причем есть следующие знания:
1. вызов DXT1 и DXT5 из разных потоков приводит к артефактам.
2. для картинок в градации серого - артефактов нет (для DXT5 с альфой).
3. если вызывать в одном потоке DXT1 а в другом DXT5 и при этом разделить общие данные, то проблемы нет.
Yandex
Объявления
24.07.2013, 11:05     Артефакты при компрессии RGB->DXT5
Ответ Создать тему
Опции темы

Текущее время: 20:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru