-
У кого-нибудь имеется перепиленная под FPC версия этого чуда? И вообще, кто-нибудь OpenGL под FPC програмит? Какие модули для работы с текстурами используете? (:
-
Нада GLScene в Lazarus запихать :) Компоненты под Kylix есть, инструкция по конвертации тоже :)
-
Я стандартными средствами OpenGL пользуюсь плюс оригинальные либы с хидерами для Delphi/FreePascal
-
Что-то я там по работе с текстурами ничего не нашёл. Максимум - это некошенрный пример загрузки bmp из файла ресурсов... ):
-
Я программирую на FPC+OpenGL! Загрузку текстур делал в связке KOL+JpegObj. Кому интересно, пишите на мыло, могу выслать исходники.
-
Много от KOL используется?
-
Не, JPG мне неинтересен из-за своей непрактичности для моих целей. Да, размер маленький, но качество и отсутствие альфы всё портят. У меня товарищь написал гораздо более лучший алгоритм сжатия изображений, основанный на фрактальном сжатии. Вот только нужно его расшевелить, что он исходниками поделился. Это лучше чем JPG. А вот TGA рулит именно из-за альфы. ВотЪ! (:
-
Magikan
Да не очень много. Загрузка из потока и сохранение в поток.
П7
А сколько времени занимает кодирование рисунка во фрактал?
-
Много. Но это не главное. Главнее декодирование, которое происходит быстро.
-
Фрактальное сжатие - это, конечно, круто. Но JPEG - известный и испытанный формат, с известными подводными камнями. Так что не всё так гладко.
-
Естественно не всё. Зато он платный, а своё не только бесплатно, но порой и бабло приносит! (:
-
Нихрена JPEG не платный. У него даже формат открыт.
-
Платность/бесплатность - это уже другой вопрос. Интересны технические аспекты.
-
> У кого-нибудь имеется перепиленная под FPC версия этого > чуда?
Только под TGA: 24, 32 бита, несжатый.
-
Спасибо человекам из этой темки: "Помогите перевести с ASM на Pascal" :) Теперь сжатые грузит. Кстати в этом модуле не хватает в конце функции LoadTGATexture не хватает строки: CloseFile(TGAFile);
А на счёт формата: ИМХА TGA лучше чем JPEG и BMP (поддержка альфа канала, отсутствие артефактов как у JPEG'а).
-
Вот собственно сам модуль:
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.
-
> У кого-нибудь имеется перепиленная под FPC версия этого > чуда? Благодоря великому и могучему интернету, нашёл непонятно чего из которого удалось выдернуть загрузку JPEG файлов. Собственно результат: http://wyvern.nightmail.ru/Texture.zipЗагружает TGA (24, 32 Bit) и JPEG изображения.
-
Слушай поделись чем нибудь(лучше если это будет пакет с одним примером т.е. всё что надо ля запуска) - я никак не могу завести OpenGL на FPc ;-)
-
Sniper17, мыло давай, пришлю свой пакетик для пуска OpenGL.
-
ogldelphi [at-at] mail.ru
|