OpenGL для начинающих

type
 tagBITMAPFILEHEADER = packed record
  bfType: Word; // тип файла - для Bmp = BM ~ $42$4D
  bfSize: DWORD; // размер файла в байтах
  bfReserved1: Word; // зарезервировано
  bfReserved2: Word; // зарезервировано
  bfOffBits: DWORD; // номер байта; со следующего начнется "изображение"
 end;
 TBitmapFileHeader = tagBITMAPFILEHEADER;
 tagBITMAPINFOHEADER = packed record
  biSize: DWORD; // размер структуры BitmapInfoHeader, байт
  biWidth: Longint; // ширина изображения
  biHeight: Longint; // высота изображения; отрицательна, если изображение
  // надо перевернуть
  biPlanes: Word; // число плоскостей изображения, всегда 1
  biBitCount: Word; // число бит на точку; ОЧЕНЬ ВАЖНЫЙ ПАРАМЕТР
  biCompression: DWORD; // Флаг компрессии - обычно BI_RGB (=0)
  biSizeImage: DWORD; // Размер изображения в байтах
  biXPelsPerMeter: Longint; // разрешение точек на метр по OX И по OY
  biYPelsPerMeter: Longint;
  biClrUsed: DWORD; // используемое количество цветов
  biClrImportant: DWORD; // Обычно = biClrUsed
 end;
 TBitmapInfoHeader = tagBITMAPINFOHEADER;
 end;
Код поясняющий это
// Для простоты определим тип, состоящий из двух нужных нам
type
 TBitmapHeader = record
  FH: TBitmapFileHeader;
  IH: TBitmapInfoHeader;
 end;
...
var
 Bmp: TBitmapHeader;
 tmp: Cardinal;
 F: hFile;
...
 // Для доступа к файлу, определяемого FileName, я использую WinAPI-функцию
 // Примерный смысл параметров, думаю, ясен
 F := CreateFile(PChar(FileName), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, 0, 0);
 // Читаем данные из файла F, данные помещаются в Bmp, количество байт которых
 // хотим прочитать - это третий параметр, количество прочитанных байт будет
 // помещено в tmp
 ReadFile(F, Bmp, sizeof(TBitmapHeader), tmp, nil);
 ...
 //
 // Ширина изображения для примера
 MessageBox(0, PChar(IntToStr(Bmp.IH.biWidth)), 'Width', MB_OK);
 ...
 // Закрываем файл
 CloseHandle(F);
После этого заголовка (в байтах это Bmp.FH.bmOffBits) хранится изображение.Следует различать две группы bmp-изображений 1, 4, 8-битные и 16, 24, 32-битные.Для первой группы сначала идет палитра - то есть перечисение цветов в форматеRed-Green-Blue-Alpha (TRGBQuad), содержащая biClrUsed-цветов (обычно это равно 2 ^ biBitCount), потом идут точки изображения - каждая точка пишется всоответсвующее количество бит (1, 4, 8) - это просто номер цвета из палитры.Для второй группы палитры нет, а сразу идут точки - для 24 и 32-битных изображений - в формате RGB и RGBA (по байту на составляющую, что и дает соответствующую битность); для 16-битных несколько хитрее, потому опущу описание.При загрузке текстуры передаются - ширина, высота изображения и массив RGB точек.Для 24- и 32- битных bmp файлов - массив получается элементарно. Для 1, 4 и 8-битных необходимо этот массив формировать на основе палитры.Примечания* Точки изображения пробегаются с нижнего левого угла.* Цвета в BMp-файле зранятся в последовательности BGR, потому при загрузке в тестуру надо менять R и B цвета местами.* На самом деле, есть еще такое понятие как байтовое выравнивание в точках,при ширине изображения кратной 4 (для текстур это разумеется верно) об этом можно не беспокоится.Пример загрузки 8- и 24-битных изображений можно посмотреть в MyOpenGL.glLoadTexture. Взято из http://forum.sources.ru Автор: Zoobastik

Очень сильно помогло для вывода текста. Спасибо.

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...