Главная / FAQ по Builder'у / 136 Как наиболее быстро загрузить...

136 Как наиболее быстро загрузить текстуру из .bmp файла для OpenGL?



void __fastcall TForm1::FormActivate(TObject *Sender)
{
    HANDLE hFile;
    AnsiString FileName;
    DWORD pPixels;
    Word nColors;
    DWORD Count, Size;
    DWORD Size1;          //для вспомогательных целей, напрямую не использую

     if(OpenDialog1->Execute())
     {
          FileName = OpenDialog1->FileName;
          //откроем файл
          hFile = CreateFile(FileName.c_str(), GENERIC_READ, FILE_SHARE_READ,
NULL,
              OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
          Size = GetFileSize(hFile, &Size1);
          //выделим память под файл
          FullBitmap = malloc(Size);
          //считаем файл в память
          ReadFile(hFile, FullBitmap, Size, &Size1, NULL);
          //закроем файл
          CloseHandle(hFile);
          asm
          {
             push ebx;
             mov ebx, FullBitmap;
             add ebx, 10;          //получим адрес  bfOffBits
             mov eax, [ebx];
             mov pPixels, eax;     //получим это число
             add ebx, 8;           //получим адрес  biWidth
             mov eax, [ebx];
             mov BitWidth, eax;
             add ebx, 4;           //получим адрес  biHeight
             mov eax, [ebx];
             mov BitHeight, eax;
             add ebx, 6;           //получим адрес  biBitCount
             mov eax, [ebx];
             mov nColors, ax;
             pop ebx;
          }
          if(nColors != 24)
          {
               AnsiString Mes = "ColorBits = " + IntToStr(nColors);

               Application->MessageBox("Данная версия программы поддерживает
только true color рисунки",
                  Mes.c_str(), MB_ICONSTOP);
               Close();
               return;
          }
          asm
          {
             mov eax, FullBitmap;
             add eax, pPixels;
             mov Pixels, eax;
          }
          Count = Size - pPixels;
          //необходимо поменять местами красную и синюю компоненты
          asm
          {
                push ebx;
                push ecx;
                push edx;
                mov ebx, Pixels;
                mov ecx, 0;             //счетчик пикселей
             @C1:
                mov eax, [ebx+ecx];     //грузим исходный пиксель + лишний байт
                mov dl, al;             //временно запомним
                shr eax, 16;            //поставим цвет на правильное место
                mov [ebx+ecx], al;      //заменим один цвет
                add ecx, 2;             //второй цвет находится через 2 байта
                mov [ebx+ecx], dl;      //заменим второй цвет
                inc ecx;                //перейдем на следующий пиксель
                cmp ecx, Count;         //обработан весь рисунок?
                jl @C1;                 //перейдем на начало цикла
                pop edx;
                pop ecx;
                pop ebx;
          }
          //занесем этот рисунок в текстуру
          //определим, как будет масштабироваться текстура
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
          glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
          //запихаем рисунок
          glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, BitWidth, BitHeight, 0,
GL_RGB, GL_UNSIGNED_BYTE, Pixels);
          glEnable(GL_TEXTURE_2D);
          glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
          EnableDrawing = true;
          Repaint();
     }
     else Close();                      //нажата кнопка Отмена
}

Sergey Kaluzhskiy 2:5055/89.27

Предыдущий вопрос   |  Список вопросов   |   Следующий вопрос

источник      На главную      by jenyok
Copyright © 2003 JTSOFT
Сайт управляется системой uCoz