Конференция "FreePascal" » Модуль Texture.pas от Jan Horn [Win32]
 
  • П7 (18.10.04 01:27) [0]
    У кого-нибудь имеется перепиленная под FPC версия этого чуда?
    И вообще, кто-нибудь OpenGL под FPC програмит? Какие модули для работы с текстурами используете? (:
  • Alek Aaz (18.10.04 04:46) [1]
    Нада GLScene в Lazarus запихать :) Компоненты под Kylix есть, инструкция по конвертации тоже :)
  • Magikan © (18.10.04 05:18) [2]
    Я стандартными средствами OpenGL пользуюсь плюс оригинальные либы с хидерами для Delphi/FreePascal
  • П7 (18.10.04 13:37) [3]
    Что-то я там по работе с текстурами ничего не нашёл. Максимум - это некошенрный пример загрузки bmp из файла ресурсов... ):
  • Stargazer (19.10.04 22:00) [4]
    Я программирую на FPC+OpenGL!
    Загрузку текстур делал в связке KOL+JpegObj.
    Кому интересно, пишите на мыло, могу выслать исходники.
  • Magikan © (20.10.04 05:54) [5]
    Много от KOL используется?
  • П7 (20.10.04 09:48) [6]
    Не, JPG мне неинтересен из-за своей непрактичности для моих целей. Да, размер маленький, но качество и отсутствие альфы всё портят. У меня товарищь написал гораздо более лучший алгоритм сжатия изображений, основанный на фрактальном сжатии. Вот только нужно его расшевелить, что он исходниками поделился. Это лучше чем JPG. А вот TGA рулит именно из-за альфы. ВотЪ! (:
  • Stargazer (25.10.04 21:33) [7]
    Magikan

    Да не очень много. Загрузка из потока и сохранение в поток.

    П7

    А сколько времени занимает кодирование рисунка во фрактал?
  • П7 (26.10.04 02:15) [8]
    Много. Но это не главное. Главнее декодирование, которое происходит быстро.
  • Stargazer (29.10.04 21:00) [9]
    Фрактальное сжатие - это, конечно, круто.
    Но JPEG - известный и испытанный формат, с известными подводными камнями.
    Так что не всё так гладко.
  • П7 (30.10.04 14:42) [10]
    Естественно не всё. Зато он платный, а своё не только бесплатно, но порой и бабло приносит! (:
  • Magikan © (31.10.04 12:34) [11]
    Нихрена JPEG не платный. У него даже формат открыт.
  • Stargazer (31.10.04 19:07) [12]
    Платность/бесплатность - это уже другой вопрос.
    Интересны технические аспекты.
  • Wyvern (12.11.04 23:31) [13]

    > У кого-нибудь имеется перепиленная под FPC версия этого
    > чуда?

    Только под TGA: 24, 32 бита, несжатый.
  • Wyvern (14.11.04 00:00) [14]
    Спасибо человекам из этой темки: "Помогите перевести с ASM на Pascal" :)
    Теперь сжатые грузит.
    Кстати в этом модуле не хватает в конце функции LoadTGATexture не хватает строки:
    CloseFile(TGAFile);

    А на счёт формата: ИМХА TGA лучше чем JPEG и BMP (поддержка альфа канала, отсутствие артефактов как у JPEG'а).
  • Wyvern (19.11.04 13:51) [15]
    Вот собственно сам модуль:

    unit TGA_Texture;

    //Модуль загрузки TGA текстуры.

    {$MODE DELPHI}
    {$asmmode Intel}

    interface

    uses
     Windows, Gl, Glu;

    function LoadTGATexture(Filename: String; var Texture: GLuint): Boolean;

    implementation

    procedure CopySwapPixel(const source, destination: Pointer);
    asm
    push eax
    push edx
    push ebx
    mov eax, source
    mov edx, destination
    mov bl,[eax+0]
    mov bh,[eax+1]
    mov [edx+2],bl
    mov [edx+1],bh
    mov bl,[eax+2]
    mov bh,[eax+3]
    mov [edx+0],bl
    mov [edx+3],bh
    pop ebx
    pop edx
    pop eax
    end;

    function FileExists (Const FileName: String) : Boolean;
    var
     Handle: THandle;
     FindData: TWin32FindData;
    begin
     Handle := FindFirstFile(Pchar(FileName), @FindData);
     Result:=Handle <> INVALID_HANDLE_VALUE;
     If Result then
       Windows.FindClose(Handle);
    end;

    function CreateTexture(Width, Height, Format: Word; pData: Pointer) : Integer;
    var
     PTexture : PGLuint;
     Texture : GLuint;
    begin
     new(PTexture);
     glGenTextures(1, PTexture);
     Texture := PTexture^;
     dispose(PTexture);
     glBindTexture(GL_TEXTURE_2D, Texture);
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  {Цвет текстуры смешивается с цветом объекта}
    //  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);  {Цвет текстуры инвертируется и смешивается с цветом объекта}
    //  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);  {Цвет текстуры не смешивается с цветом объекта}

     { Select a filtering type. BiLinear filtering produces very good results with little performance impact
       GL_NEAREST               - Basic texture (grainy looking texture)
       GL_LINEAR                - BiLinear filtering
       GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
       GL_LINEAR_MIPMAP_LINEAR  - BiLinear Mipmapped texture
     }  

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    //  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

     if Format = GL_RGBA then
       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
       else
         gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);

     result :=Texture;
    end;

    function LoadTGATexture(Filename: String; var Texture: GLuint): Boolean; //Загружает только не сжатые 24 или 32 бтные TGA файлы.
    var
     TGAHeader : packed record   // Заголовок TGA файла
       FileType     : Byte;
       ColorMapType : Byte;
       ImageType    : Byte;
       ColorMapSpec : Array[0..4] of Byte;
       OrigX  : Array [0..1] of Byte;
       OrigY  : Array [0..1] of Byte;
       Width  : Array [0..1] of Byte;
       Height : Array [0..1] of Byte;
       BPP    : Byte;
       ImageInfo : Byte;
     end;
     TGAFile   : File;
     bytesRead : Integer;
     image     : Pointer;
     CompImage : Pointer;
     Width, Height : Integer;
     ColorDepth    : Integer;
     ImageSize     : Integer;
     BufferIndex : Integer;
     currentByte : Integer;
     CurrentPixel : Integer;
     I : Integer;
     Front: ^Byte;
     Back: ^Byte;
     Temp: Byte;
     BytePerPixel: Byte;

    begin
     result :=FALSE;
     GetMem(Image, 0);
     if FileExists(Filename) then
       begin
         AssignFile(TGAFile, Filename);
         Reset(TGAFile, 1);

         // Читаем заголовок
         BlockRead(TGAFile, TGAHeader, SizeOf(TGAHeader));
       end
       else
       begin
         MessageBox(0, PChar('File not found  - ' + Filename), PChar('TGA Texture'), MB_OK);
         Exit;
       end;

     if (TGAHeader.ImageType <> 2) and    { TGA_RGB, RGBA }
        (TGAHeader.ImageType <> 10) then  { Сжатые TGA_RGB, RGBA }
       begin
         CloseFile(tgaFile);
         MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Формат TGA файла не поддерживается.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

       // Don't support colormapped files
     if TGAHeader.ColorMapType <> 0 then
       begin
         CloseFile(TGAFile);
         MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Colormapped TGA files not supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

     // Получем ширину, высоту и глубину цвета
     Width  := TGAHeader.Width[0]  + TGAHeader.Width[1]  * 256;
     Height := TGAHeader.Height[0] + TGAHeader.Height[1] * 256;
     ColorDepth := TGAHeader.BPP;
     BytePerPixel := ColorDepth div 8;
     ImageSize  := Width*Height * BytePerPixel;

     if BytePerPixel < 3 then
       begin
         CloseFile(TGAFile);
         MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Only 24 and 32 bit TGA files supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

     GetMem(Image, ImageSize);

     if TGAHeader.ImageType = 2 then   // Standard 24, 32 bit TGA file
     begin

       BlockRead(TGAFile, image^, ImageSize, bytesRead);
       if bytesRead <> ImageSize then
         begin
           CloseFile(TGAFile);
           MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
           Exit;
         end;
       CloseFile(tgaFile);

       // Смена R и B компонент цвета.
       for I :=0 to Width * Height - 1 do
       begin
         Front := Pointer(Integer(Image) + I * BytePerPixel);
         Back := Pointer(Integer(Image) + I * BytePerPixel + 2);
         Temp := Front^;
         Front^ := Back^;
         Back^ := Temp;
       end;
       if BytePerPixel = 3 then
         Texture := CreateTexture(Width, Height, GL_RGB, Image)
         else
           Texture := CreateTexture(Width, Height, GL_RGBA, Image);
     end;

     if TGAHeader.ImageType = 10 then
     begin
       ColorDepth :=ColorDepth DIV 8;
       CurrentByte :=0;
       CurrentPixel :=0;
       BufferIndex :=0;

       GetMem(CompImage, FileSize(TGAFile)-sizeOf(TGAHeader));
       BlockRead(TGAFile, CompImage^, FileSize(TGAFile)-sizeOf(TGAHeader), BytesRead);   // load compressed data into memory
       if bytesRead <> FileSize(TGAFile)-sizeOf(TGAHeader) then
       begin
         CloseFile(TGAFile);
         MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;
       CloseFile(tgaFile);

       // Extract pixel information from compressed data
       repeat
         Front := Pointer(Integer(CompImage) + BufferIndex);
         Inc(BufferIndex);
         if Front^ < 128 then
         begin
           For I := 0 to Front^ do
           begin
             CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex+I*ColorDepth), Pointer(Integer(image)+CurrentByte));
             CurrentByte := CurrentByte + ColorDepth;
             inc(CurrentPixel);
           end;
           BufferIndex :=BufferIndex + (Front^+1)*ColorDepth
         end
         else
         begin
           For I := 0 to Front^ -128 do
           begin
             CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex), Pointer(Integer(image)+CurrentByte));
             CurrentByte := CurrentByte + ColorDepth;
             inc(CurrentPixel);
           end;
           BufferIndex :=BufferIndex + ColorDepth
         end;
       until CurrentPixel >= Width*Height;

     if BytePerPixel = 3 then
       Texture := CreateTexture(Width, Height, GL_RGB, Image)
       else
         Texture := CreateTexture(Width, Height, GL_RGBA, Image);
      end;
     Result :=TRUE;
     FreeMem(Image, ImageSize);
    end;

    end.
  • Wyvern (13.12.04 22:36) [16]
    > У кого-нибудь имеется перепиленная под FPC версия этого
    > чуда?

    Благодоря великому и могучему интернету, нашёл непонятно чего из которого удалось выдернуть загрузку JPEG файлов.
    Собственно результат:
    http://wyvern.nightmail.ru/Texture.zip
    Загружает TGA (24, 32 Bit) и JPEG изображения.
  • Sniper17 (25.12.04 23:16) [17]
    Слушай поделись чем нибудь(лучше если это будет пакет с одним примером т.е. всё что надо ля запуска) - я никак не могу завести OpenGL на FPc ;-)
  • Stargazer (25.12.04 23:42) [18]
    Sniper17,
    мыло давай, пришлю свой пакетик для пуска OpenGL.
  • Sniper17 (27.12.04 13:26) [19]
    ogldelphi [at-at] mail.ru
 
Конференция "FreePascal" » Модуль Texture.pas от Jan Horn [Win32]
Есть новые Нет новых   [134427   +37][b:0][p:0.001]