|
Языки программирования Изучаем С++, Sql, php, Lua, Python |
|
Опции темы | Поиск в этой теме | Опции просмотра |
24.03.2012, 13:48 | #1 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
DXT декомпрессия
В общем решил начать изучать OpenGL, но все понемногу. Решил разобраться как устроен modelviewer. Естественно, использую Qt4 и его модуль, но вопрос сейчас не по 3D графике
Не могу прочитать BLP %) Точней могу, но не понимаю как правильно оперировать с данными. Использую squish библиотеку для декомпрессии изображения, но наверное делаю что-то не так. Никак не получается вывести картинку - вместо нее набор цветопикселей Вот код (может кому-то он ничего не скажет, но суть, я думаю, поймете) Код:
QPixmap Texture::getImage() { int mipmax = m_header.hasMips ? 16 : 1; QDataStream stream(m_buffer); stream.setByteOrder(QDataStream::LittleEndian); QVector<quint8> data; quint8 d = 0; for (quint8 i = 0; i < mipmax; i++) { stream.skipRawData(m_header.offsets[i]); for (quint32 j = 0; j < m_header.lengths[i]; j++) { stream >> d; data << d; } } QVector<quint8> v; v.resize(m_header.width * m_header.height * 16 * 4); squish::DecompressImage(&v[0], m_header.width, m_header.height, data.data(), m_header.encoding); QImage img(v.data(), m_header.width, m_header.height, QImage::Format::Format_ARGB32); return QPixmap::fromImage(img); } PS WMV 0.4 http://wowmv.svn.sourceforge.net/viewvc/wowmv/src/ WMV Latest http://code.google.com/p/wowmodelviewer/source/browse/ SQUISH http://code.google.com/p/libsquish/
__________________
SpellWork Qt4 Последний раз редактировалось Sid; 24.03.2012 в 13:52. |
24.03.2012, 18:47 | #2 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
А зачем его разжимать? DXT это "железный" формат.
|
24.03.2012, 18:50 | #3 | |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Цитата:
__________________
SpellWork Qt4 |
|
25.03.2012, 09:02 | #5 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Вот уже что-то)
Код:
QPixmap Texture::getImage() { QDataStream stream(m_buffer); stream.setByteOrder(QDataStream::LittleEndian); QVector<quint8> data; quint8 d = 0; stream.skipRawData(m_header.offsets[0]); for (quint32 j = 0; j < m_header.lengths[0]; j++) { stream >> d; data << d; } squish::u8* uncompressed; if (m_header.encoding == 2) { int dxtver; switch (m_header.alphaEncoding) { case 0: dxtver = squish::kDxt1; break; case 1: dxtver = squish::kDxt3; break; case 7: dxtver = squish::kDxt5; break; //default: std::cout << "DXT version not recognized.\n"; return false; break; } uncompressed = new squish::u8[m_header.width * m_header.height * 4]; squish::DecompressImage(uncompressed, m_header.width, m_header.height, data.data(), dxtver); } else uncompressed = data.data(); QVector<QRgb> colors; for (quint32 i = 0; i < 256; i++) { colors.append(qRgba(m_header.colors[i].r, m_header.colors[i].g, m_header.colors[i].b, m_header.colors[i].a)); } QImage img(uncompressed, m_header.width, m_header.height, QImage::Format::Format_Indexed8); return QPixmap::fromImage(img); } Делал setColorTable и заполнял ее из ARGB[256] куска после данных, тогда картинка вообще белая -_-
__________________
SpellWork Qt4 |
25.03.2012, 09:27 | #6 |
Пользователь
Регистрация: 06.01.2012
Сообщений: 98
Сказал(а) спасибо: 12
Поблагодарили 33 раз(а) в 21 сообщениях
|
палитра находится сразу за mipmapSize блоками
|
25.03.2012, 09:44 | #7 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Ну я с нее и заполнял.
__________________
SpellWork Qt4 |
25.03.2012, 11:18 | #8 |
MaNGOS Dev
Регистрация: 07.03.2010
Сообщений: 314
Сказал(а) спасибо: 30
Поблагодарили 153 раз(а) в 83 сообщениях
|
Первый намек видимо был не понят.
http://www.opengl.org/registry/specs...ssion_s3tc.txt glCompressedTexImage2D GL_COMPRESSED_RGBA_S3TC_DXT1_EXT GL_COMPRESSED_RGBA_S3TC_DXT3_EXT GL_COMPRESSED_RGBA_S3TC_DXT5_EXT |
25.03.2012, 12:00 | #9 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Уже разобрался, я так понял что в дате указан номер цвета из палитры. Прогоняю 256х256 цикл, но не получаю нужного)) Код взял из модельвивера. Получается такая фигня.
http://my.jetscreenshot.com/4271/20120325-gyd8-106kb PS если убрать все эти манипуляции с uint32 и сделать мой вариант через стурктуру и преобразовение в rgba от qt то тоже самое. Код:
for (quint32 x = 0; x < m_header.width; x++) { ARGBColor8 k = m_header.colors[*c++]; *p++ = qRgba(k.r, k.g, k.b, 255); }
__________________
SpellWork Qt4 |
25.03.2012, 12:30 | #10 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Тема превратилась в "как прочитать BLP"
__________________
SpellWork Qt4 |
25.03.2012, 13:24 | #11 |
Ученый
Регистрация: 02.04.2010
Сообщений: 237
Сказал(а) спасибо: 41
Поблагодарили 99 раз(а) в 44 сообщениях
|
Все! Я это сделал) Осенило что картинка была белой после того как я устанавливал палитру, значит альфа была нулевая. Установил палитру так же, только альфу в ней сделал 255 и все четко
http://my.jetscreenshot.com/4271/20120325-jjrz-70kb
__________________
SpellWork Qt4 |
Пользователь сказал cпасибо: | Gerald (25.03.2012) |