Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
1

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

23.07.2013, 16:15. Просмотров 650. Ответов 6
Метки нет (Все метки)

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

JPEG -> ARGB -> DXT5
Суть в следующем: У меня есть картиночка в формате JPEG. Я ее разжимаю в RGB,...

программа на С++ для компрессии/декомпрессии файлов
Посоветуйте пожалуйста литературу по этому вопросу,а также посоветуйте какие...

Как сделать выбор RGB по умолчанию при при сохранении файлов в Inkscape ?
Столкнулся с тем, что Inkscape сохраняет изображение в СMYK. Мне нужно RGB....

Составить программу компрессии строк
КОМПРЕССИЯ СТРОК. Рассмотрим следующий алгоритм сжатия строк: если в строке...

Ошибка при работе с rgb
в чем ошибка? ImageFon.Canvas.Pixels := rgb(MyColor, MyColor, MyColor)

6
SatanaXIII
Почетный модератор
Эксперт С++
5773 / 2773 / 377
Регистрация: 01.11.2011
Сообщений: 6,743
Завершенные тесты: 1
23.07.2013, 16:39 2
Ну вы же занимаетесь цветовой компрессией. Чего же ви хочите от нее?
Возможно скажу очевидную вещь, но попробуйте поиграться с коэффициентами.
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
24.07.2013, 06:40  [ТС] 3
Очень странно. От случая к случаю на одних и тех же входных данных я иногда наблюдаю артефакты иногда нет. Алгоритм должен выдавать на одних и тех же данных один и тот же ответ всегда. Или я ошибаюсь? Это было бы очень странно. При этом повторюсь, DXT1 дает ВСЕГДА правильную картинку без артефактов.
0
SatanaXIII
Почетный модератор
Эксперт С++
5773 / 2773 / 377
Регистрация: 01.11.2011
Сообщений: 6,743
Завершенные тесты: 1
24.07.2013, 10:08 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. Следовательно надо искать косяк где-то в этих преобразовании. Я думаю. Но вообще в ассемблере не силен, поэтому детальнее подсказать не могу.
1
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
24.07.2013, 10:19  [ТС] 5
решилась проблема. библиотека эта нифига не threadsafe. есть там массивчики общие, я мурзилку тоже ассемблерную не знаю. видимо где то они меняются по ходу компрессии из разных потоков.
в смысле я сам из нескольких поток вызываю функции компрессии.
0
SatanaXIII
Почетный модератор
Эксперт С++
5773 / 2773 / 377
Регистрация: 01.11.2011
Сообщений: 6,743
Завершенные тесты: 1
24.07.2013, 10:23 6
А. А если для DXT5 из одного потока вызывать, то все в порядке, да?
0
Kukurudza
105 / 86 / 13
Регистрация: 29.08.2012
Сообщений: 539
24.07.2013, 11:05  [ТС] 7
Цитата Сообщение от SatanaXIII Посмотреть сообщение
А. А если для DXT5 из одного потока вызывать, то все в порядке, да?
верно. причем есть следующие знания:
1. вызов DXT1 и DXT5 из разных потоков приводит к артефактам.
2. для картинок в градации серого - артефактов нет (для DXT5 с альфой).
3. если вызывать в одном потоке DXT1 а в другом DXT5 и при этом разделить общие данные, то проблемы нет.
0
24.07.2013, 11:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2013, 11:05

Программно отличить тип компрессии аттача
Добрый день, уважаемые участники! Есть ли возможность программно отличить...

Артефакты при WM_SIZE
Всем, доброго дня второй день не могу решить вопрос: На форме 2 кнопки...

Артефакты при перетаскивании контрола
Здравствуйте! У меня задача - ограничить область перетаскивания контрола...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru