PMG

Форумы по созданию игр
Текущее время: 22 июл 2026 06:36

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 13 ] 
Автор Сообщение
 Заголовок сообщения: Работа с BMP файлами
СообщениеДобавлено: 10 май 2005 22:55 
Не в сети
Опытный
Аватара пользователя

Зарегистрирован: 11 дек 2004 22:33
Сообщения: 112
Откуда: Ханты-Мансийск
Как мне считать BMP и записать его в привычный для OpenGL формат не
используя функций библиотеки GLAUX.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 12 май 2005 09:48 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Устроит тебя IPicture Basecode:
http://nehe.gamedev.net/counter.asp?fil ... icture.zip

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 15 июл 2005 14:53 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Средствами glut и glaux это лучше не делать. Вот либы подходящие:
http://www.xdp.it/cximage.htm - CxImage for Win
http://openil.sourceforge.net/ - DevIL
http://www.imagemagick.org/
http://freeimage.sourceforge.net/
http://www.paintlib.de/
http://www.graphicsmagick.org/

По-моему лучше всего DevIL, так как там есть сразу загрузка в текстуру.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 сен 2005 09:36 
Не в сети
Любитель

Зарегистрирован: 15 авг 2005 21:32
Сообщения: 46
Откуда: NSK
Я вообще придумал свой формат =) очень похожий на BMP только BGR перевернут как положено в RGB.

Сначала конвертирую BMP в свой GDIB, и загружаю его в два плевка в память, а потом в видеокарту и удаляю из памяти.
Функция загрузки очень похожа на AUXDIBIMAGELOAD только библиотеку подключать ненадо =)


GDIB формат:

3 байта | DIB Может отсутствовать
1 байт | Резерв
2 байта | X
2 байта | Y
76543210 | Биты рассматриваются отдельно (Я это игнорирую, может пригодится для анимации)
||||||||-------- R состовляющая GL_RED
|||||||--------- G Состовляющая GL_GREEN
||||||---------- B Сосотовляющая GL_BLUE
|||||----------- Альфа состовляющая GL_ALPHA
||||------------ L Светлота GL_LUMINANCE
|||------------- 1 единственный цветовой индекс GL_COLOR_INDEX
||-------------- D Глубина GL_DEPTH_COMPONENT
|--------------- если =1 то данный параметр неучитывется а учитывается следующий
2 байта | InternalFormat (components)
1 байт | значение из /* PixelFormat */ например GL_LUMINANCE_ALPHA
| Добавляется к 1900h
1 байт | значение из /* DataType */ например GL_BYTE
| Добавляется к 1400h
4 байта | Длинна картинки
*Данные*

Если файл незаканчивается значит это анимация и грузит следующие кадры.

_________________
Хочу иметь.... много компьютеров, много денег, и быть известным. Но я не Гилл Бетс =))


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 20 сен 2005 14:34 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Лихо. Просто и понятно.

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Работа с BMP файлами
СообщениеДобавлено: 17 апр 2006 00:40 
Не в сети
Любитель
Аватара пользователя

Зарегистрирован: 07 апр 2006 23:21
Сообщения: 23
Откуда: Мозырь, Беларусь
eNrix писал(а):
Как мне считать BMP и записать его в привычный для OpenGL формат не
используя функций библиотеки GLAUX.

Прочитать описание формата bmp и написать собственную процедуру загрузки.
PS: imho это очевидно... не так ли?

_________________
С уважением, Виталий Лещенко.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 апр 2006 01:04 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
можно например так:
Код:
struct BMPFileHeader
{
   unsigned short usType;
    unsigned int uiSize;
    unsigned short usReserved1;
    unsigned short usReserved2;
    unsigned int uiOffBits;
};

struct BMPInfoHeader
{
   unsigned int  uiSize;
    long   lWidth;
    long   lHeight;
    unsigned short usPlanes;
    unsigned short usBitCount;
    unsigned int uiCompression;
    unsigned int uiSizeImage;
    long lXPelsPerMeter;
    long lYPelsPerMeter;
    unsigned int uiClrUsed;
    unsigned int uiClrImportant;
};

BOOL CImage::LoadData(char *path)
{
   FILE *pFile;
   int iEnd,iStart;

   pFile = fopen(path,"rb");

   fseek( pFile, 0, SEEK_END );
   iEnd = ftell( pFile );
   fseek( pFile, 0, SEEK_SET );
   iStart = ftell( pFile );
   iSize = iEnd - iStart;

   pData = new unsigned char[iSize];
   
   if(fread(pData,sizeof(unsigned char),iSize,pFile)!=unsigned(iSize))
      return FALSE;
   
   fclose(pFile);

   LoadBMP();

   return TRUE;
}

BOOL CImage::LoadBMP( void )
{
   BMPFileHeader* fileHeader;
   BMPInfoHeader* infoHeader;
   unsigned int iImageSize;
   unsigned char uiTempRGB;
   unsigned int i;
   unsigned char* ucpFile= pData;

   fileHeader= ( BMPFileHeader* )ucpFile;


   ucpFile  += sizeof( BMPFileHeader );
   infoHeader= ( BMPInfoHeader* )ucpFile;
   

   ucpFile  += sizeof( BMPInfoHeader );
   ucpFile  += fileHeader->uiOffBits;


   iImageSize= fileHeader->uiSize - fileHeader->uiOffBits;
   Create( infoHeader->lWidth, infoHeader->lWidth, infoHeader->usBitCount );

   
   memcpy( pData, ucpFile, iImageSize );


   for( i=0; i<infoHeader->uiSizeImage; i+=3 )
   {
      uiTempRGB     = pData[i];
      pData[i]  = pData[i+2];
      pData[i+2]= uiTempRGB;
   }

   
   return true;
}


А вот описание класса чтоб не было вопросов по переменным
Код:
class CImage 
{
private:
   int iSize;
   unsigned char *pData;

   int iWidth;
   int iHeight;

   unsigned short chBPP;

   BOOL LoadBMP(GLvoid);
public:   
   BOOL LoadData(char *path);
   BOOL Create( unsigned int uiWidth, unsigned int uiHeight, unsigned short chBPP );
   BOOL Destroy( GLvoid );


сначала лоад дата, потом лоад БМП. А функция креате просто выделяет массив памяти uiWidth*uiHeight*chBBB (chBPP кол во бит на пиксель)
Если я правильно понял "приемлимо для OpenGL" :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 апр 2006 10:00 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Ты здесь просто читаешь файл, а где вывод?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 апр 2006 10:17 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Не совсем понял что значит вывод...
Можно же просто в текстуру преобразовать после LoadBMP у нас остались чистая картинка (без заголовков) и еще осталась ширина, высота... Вроде все что надо для текстуры
Код:
glTexImage2D( GL_TEXTURE_2D, 0, iType, m_uiWidth, m_uiHeight,
                 0, iType, GL_UNSIGNED_BYTE, m_ucpData );


Ну до этого всякие GenTextures и прочее но это уже понятно.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 апр 2006 16:38 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
Хм, а ты выводил?

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 17 апр 2006 16:43 
Не в сети
Постоянный
Аватара пользователя

Зарегистрирован: 27 мар 2006 22:26
Сообщения: 63
Откуда: Москва
Угу - выводил. А что тебя смущает? есть область в памяти где 3 байта на пиксель и мы знаем сколько пикселей в ширину и высоту... все параметры для генерации текстуры :)


Вернуться к началу
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: 18 апр 2006 08:52 
Не в сети
Гуру
Аватара пользователя

Зарегистрирован: 03 авг 2004 10:37
Сообщения: 2694
А ну да заметил смену байт ты сделал!

_________________
С уважением, Сергей


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 13 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB