XGM Forum
Сайт - Статьи - Проекты - Ресурсы - Блоги

Форуме в режиме ТОЛЬКО ЧТЕНИЕ. Вы можете задать вопросы в Q/A на сайте, либо создать свой проект или ресурс.
Вернуться   XGM Forum > Warcraft> Моделлинг
Ник
Пароль
Войти через VK в один клик
Сайт использует только имя.

Закрытая тема
 
DarkElf_89

offline
Опыт: 35
Активность:
Проблема с форматом BLP2
Здравствуйте, уважаемые форумчане ! Довольно долго читал форум, видел что здесь сидят люди, которые хорошо разбираются в форматах текстур. Решил обратиться со своей проблемой ... Помогите плиз если не сложно. Итак, нужно мне выдернуть из WoWа некоторые текстуры. Сначала пользовался WoW model viewer, сохранял текстуры в bmp, но потом замучился их дергать по одной. Решил написать свой код для извлечения их из mpq-архивов, именно с извлечением разобрался, используя библиотеку libmpq. Далее нашел в википедии спецификацию bl2 формата, взял первую попавшуюся текстуру, начал экспериментировать. Определил что в этой текстуре используется DXT1 сжатие. В исходниках wow model viewer нашел функцию декомпрессии, переписал к себе, в целом первый мипмап разжимет нормально, но... появляются непонятные искажения цвета всегда вверху изображения, в этом собственно и проблема. Между тем, blp lab отлично открывает эту текстуру, без искажений, значит дело не в самой текстуре, битой она быть не может. Вот в этом проблема, вообщем посмотрите сами :

Слева-то что получено мной, справа-в blp lab.
Вот код на c++ функции декомпрессии :
Код:
void decompressDXT(int w, int h,unsigned char *src,unsigned char *dest){
 unsigned q0, q1, c0, c1;
 for (int y=0; y<h; y+=4){
  for (int x=0; x<w; x+=4){
   c0 = *(unsigned short*)(src + 0);                         //получаем базовые цвета
   c1 = *(unsigned short*)(src + 2);
   src += 4;
   color c[4];
   c[0].b = (unsigned char) ((c0 >> 11) & 0x1f) << 3;        //создаем палитру из 4 цветов
   c[0].g = (unsigned char) ((c0 >>  5) & 0x3f) << 2;
   c[0].r = (unsigned char) ((c0      ) & 0x1f) << 3;
   c[1].b = (unsigned char) ((c1 >> 11) & 0x1f) << 3;
   c[1].g = (unsigned char) ((c1 >>  5) & 0x3f) << 2;
   c[1].r = (unsigned char) ((c1      ) & 0x1f) << 3;
   if(c0 > c1) {
    c[2].r = (c[0].r * 2 + c[1].r) / 3;
    c[2].g = (c[0].g * 2 + c[1].g) / 3;
    c[2].b = (c[0].b * 2 + c[1].b) / 3;
    c[3].r = (c[0].r + c[1].r * 2) / 3;
    c[3].g = (c[0].g + c[1].g * 2) / 3;
    c[3].b = (c[0].b + c[1].b * 2) / 3;
   } else {
    c[2].r = (c[0].r + c[1].r) / 2;
    c[2].g = (c[0].g + c[1].g) / 2;
    c[2].b = (c[0].b + c[1].b) / 2;
    c[3].r = 0;
    c[3].g = 0;
    c[3].b = 0;
   }

   for (int j=0; j<4; j++) {                   
    unsigned index = *src++;                  
    unsigned char* dd = dest + (w*(y+j)+x)*4;
    for (int i=0; i<4; i++) {
     *dd++ = c[index & 0x03].b;
     *dd++ = c[index & 0x03].g;
     *dd++ = c[index & 0x03].r;
     *dd++;
     index >>= 2;
    }
   }
  }
 }
}

//а вот само чтение из файла и декомпрессия
struct blp2header{
    char           id[4];                          //'BLP2'
    unsigned       type;                           //тип компрессии
    unsigned char  encode;                         //несжатый или DirectX
    unsigned char  alphaD;                         //альфа канал
    unsigned char  alphaE;                         //тип альфы
    unsigned char  mip_lvls;                       //mipmap
    unsigned       w;                              //ширина
    unsigned       h;                              //высота
    unsigned       offs[16];
    unsigned       lens[16];
  };

blp2header header;
FILE *f=fopen(filename,"r");
fread(&header,1,sizeof(header),f);
unsigned char *cbuf=(unsigned char*)malloc(header.lens[0]);
unsigned char *buf;
buf=(unsigned char*)malloc(header.w*header.h*4);
fseek(f,header.offs[0],SEEK_SET);
fread(cbuf,1,header.lens[0],f);
decompressDXT(header.w, header.h,cbuf,buf);
....
//дальше натягиваю текстуру из buf на полигон (opengl) и получаю собственно что на картинке...

Всю голову уже сломал, не пойму в чем ошибка ... Подскажите пожалуйста, знающие люди)))
Во вложении сама текстура...
Прикрепленные файлы
Тип файла: rar BM_SHDWFANG_OUTERWALL_01.rar (37.3 Кбайт, 23 просмотров )
Старый 26.09.2009, 01:09
Hellfim
Новичок
offline
Опыт: 79,707
Активность:
===> сюда <===
Старый 26.09.2009, 14:28
ShadoW DaemoN

offline
Опыт: 37,078
Активность:
Вышеуказанный код выглядит вполне работоспособным, структура соблюдена.
В качестве теста мне скомпилировали код с выводом в файл после декодирования (RAW формат, RGBA). И он был без дефектов. К тому же, если бы алгоритм декодирования был некорректным, то "помехи" были бы периодическими.
Вывод - "натягивание текстур на полигон (opengl)" может проходить некорректно. Либо идет перезапись первых байтов буфера.
Старый 26.09.2009, 20:02
DarkElf_89

offline
Опыт: 35
Активность:
ShadoW DaemoN, спасибо огромное за ответ ! Проблему решил, видимо правда была перезапись байтов, хотя еще не разобрался почему так получалось. Сделал запись в выходной буфер блоками по 16 пикселей - деффекты пропали.
Hellfim, также спасибо большое - за совет !
Старый 26.09.2009, 21:46
Закрытая тема

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы можете скачивать файлы

BB-коды Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход



Часовой пояс GMT +3, время: 12:33.