-
У кого-нибудь имеется перепиленная под 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
-
Я завёл OpenGL только на GLUT... но меня это не устраивает... хочется на dglOpenGL.pas (v1.5) ;-) Ну или на крайняк на OpenGL.pas
>>Stargazer Незабудь сделать максимальное сжатие... лучше 7-zip формат 7z(если есть) но и RAR'ом подойдёт! =)
-
-
-
Компилятором 1.0.10 не компилится ;-(
-
Ошибки в модуле Textures....
-
Sniper17>Компилятором 1.0.10 не компилится ;-( ? Компилил с помощью DevPascal c прицепленным компилятором 1.0.10 Бинарник же как-то получился...
Sniper17>Ошибки в модуле Textures.... Какие?
Сглючил файл OpenGL_Template.dp.
Его содержание должно быть таким:
[Project] FileName=D:\DevPas\Project\OpenGL_Template\OpenGL_Template.dp Name=OpenGLTemplate MainUnit=D:\DevPas\Project\OpenGL_Template\Texture.pas UnitCount=3 ResFiles=D:\DevPas\Project\OpenGL_Template\rsrc.rc NoConsole=1 IsDll=0 Icon=D:\DevPas\Project\OpenGL_Template\CobraMK3.ico CompilerOptions= IncludeDirs= ObjFile= [Unit1] FileName=D:\DevPas\Project\OpenGL_Template\Main.pas FileTime=832481002 [Unit2] FileName=D:\DevPas\Project\OpenGL_Template\Texture.pas FileTime=832481002 [Unit3] FileName=D:\DevPas\Project\OpenGL_Template\OGLT_Modules.pas FileTime=832481528
-
Ну не знаю.. у меня нет DevPascal у меня только IDE под DOS ;-))) Пытался компилить main.pas... получается только если отрубить textures и файл exe какой то большой 900Kb ж-(
-
Скачал Dev-Pascal... создал проект.. добавил файлы скомпилировал ресурс (иконку)... Далее компилирую, выдаётся Compiler and Linker window... в нём hint'ы и никакого exe файла не получается! ;-(((
-
Из FPC 1.0.10 берём папку BIN и UNITS и заменяем ими аналогичные в DevPas (те что в DevPas надо грохнуть или переместить куда-нибудь). Правим файл devpas.ini следующим образом (предполагаестся, что DevPas установлен на диске D):
[Directories] BinDir=D:\DevPas\bin\win32\ PasDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\ LibDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\ AddDir=0 Dir= AddCommands=0 Commands= [Saved_Dirs_Freepascal] BinDir=D:\DevPas\bin\win32\ PasDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\ LibDir=D:\DevPas\units\win32\;D:\DevPas\units\win32\rtl\;D:\DevPas\units\win32\fcl\
После (успешной :) ) компиляции он всегда выдаёт две ошибки (на них можно забить, т.к. это просто две строки сообщения компилятора, которые DevPas идентифицирует как ошибки).
Вот вроде бы всё, если не поможет попробую выложить DevPas со встроенным FPC 1.0.10 (всё это хозяйство около 9~10 МБ весит RAR3.xx + Мах сжатие + непрерывный архив, и через момед тягать фиговато :( ).
-
Сделал всё как написано... (промучался почти час ;-)))
Скопилировал тестовый "проект"
program Untitled; var i: Integer; begin i:=i+1; end. Компилируется пишет "Project 2 compiled successfully" exe создаётся и жизнь хороша ;-) Пытаюсь скомпилтровать OpenGL шаблон... нифига Куча вот таких сообщений "633 / 14 texture.pas Hint: Local type PHUFF is not used" И в конце НЕ пишется "compiled successfully" и exe не создаётся! ;-(
-
Всё получилось! Порядок модулей надо было поменять! ;-)))))
-
Sniper17>Всё получилось! Порядок модулей надо было поменять! Тады ура :) . А насчёт сообщений: "633 / 14 texture.pas Hint: Local type PHUFF is not used" Это функция загрузки JPG файлов, я допинал её чтоб заработала отдельно от кучи других модулей (в оригинале она должна была загружать GIF, TGA, JPG, PNG?) цепляла к себе ДиректХы и ещё всякого разного (JPG не зеркалила, да и ошибочки были некоторые).
-
>>Wyvern: теперь вопрос как думаешь стоит ли переписать мою OpenGL недо-гамезу под FreePascal... будут ли ОЩУТИМЫЕ ПЛЮСЫ?
-
Sniper17: как думаешь стоит ли переписать мою OpenGL недо-гамезу под FreePascal... будут ли ОЩУТИМЫЕ ПЛЮСЫ?
Ощутимые в чём, в скорости - не знаю, в объёме - а смысл (текстурный модуль выигрывает порядка 50 кило, т.к. не используется запись JPG изображений, но при нынешних объёмах памяти это несуществено), разве что можешь продавать её за денежку без отчислений борланду и т.п. (вроде бы). Ну и чисто для себя, типа Я МОГУ. :)
-
А как насчёт директив типа {$mmx} и опций компилера target processor, Level1 и Level2 optimization?
-
>>Sniper17: А как насчёт директив типа {$mmx} и опций компилера target processor, Level1 и Level2 optimization?
Я в такие тонкости ещё не влезал. %)
-
Wyvern: а я первое что смотрю - это опции компилятора.. %-)
-
Как-то всё у вас тут тяжело, если эта тема кого-то ещё интересует, могу выложить свои исходники и пояснить, если что, программы у меня на чистом Win32API, компилятся как в Delphi так и FreePascal
-
Конечно интересует! =)
-
-
Вот забыл. Основной файл - template.dpr. Если компилировать в Delphi то ничего менять не нужно, если в FreePascal - расширение вместо dpr на pas поменять (хотя если не менять оно тоже скомпилируется, только в fp.exe подсветка синтаксиса на этом файле работать не будет).
-
FPC скомпилил без вопросов! ;-) Delphi 7 не хочет - обижается на стоки ReadFile(F,Header,SizeOF(Header),n,nil) фразами [Error] TexLoad.pas(179): Types of actual and formal var parameters must be identical
-
Delphi7 не для OpenGL на мой взгляд, у меня Delphi 3 - всё ок! Хотя я всё равно разберусь ;) Вот, кстати http://opengl.land.ru/files/header.zip -> моя версия gl.pp (только для win32!) - по идее, должно уменьшить размер exe на 20-30кб
-
Попробуй посмотреть, какие параметры требует ReadFile в Delphi7. Мне кажется, если два последних поменять с Integer на Longint или что-то в этом роде, то должно работать.
-
Кстати не работает на 1.9.6. Работает только на 1.0.10 ;-(
-
В IDE нужно поставить mode-release, тогда всё заработает. У меня с коммандной строки всё компилируется и запускается без проблем. Для gl.pp нужно включить smartlink (он собственно, для этого режима и делался) Вы ж как-то поинформативней описуйте ошибки ;)
-
>>frame: Как-то всё у вас тут тяжело Так онож ещё и JPG грузит (да и заголовочный файл ипользуется нестандартный dglOpenGL.pas, всё-в-одном). >>frame: Иногда проще написать самому, чем добиться этого от окружающих =) Всегда :о)
-
новый dglOpenGL.pas с версии 1.6 поддерживает и FPC=) Может переделать?
-
>>Sniper17: новый dglOpenGL.pas с версии 1.6 поддерживает и FPC Уже 1.6 есть, это хорошо :о) 1.5 тоже FPC поддерживает, только как-то коряво.
>>Sniper17: Может переделать? Чего переделать?
-
Модуль texload.pas не скомпилировался: Texture.pas(508,31) Error: You can not reach COSTAB from that code
Texture.pas(564,31) Error: You can not reach COSTAB from that code отсюда: PROCEDURE invDCTfix(var dst,src:Tblocklongint);assembler;
-
Удалено модератором
-
звиняюсь за некропостинг, однако не удержусь: > 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 eaxend;
о хосспаде... кто писал это... этот... код? есть ведь гораздо более быстрые (алсо, вменяемые) способы! EAX: [ 0 1 2 3 ] EDX: [ 2 1 0 3 ] напоминает RGBA -> BGRA переход, правда? не проще ли будет сделать вот так: procedure CopySwapPixel(const source, destination: Pointer);
asm
MOV ECX, [EAX];
BSWAP ECX;
ROR ECX, 8;
MOV [EDX], ECX;
end;
по х86-соглашениям (а этот код определённо заточен под 32, если Pointer-ы имеют четырёхбайтный размер), стандартная pascal-евская директива вызова предполагает наличие в EAX первого параметра, а в EDX — второго. на протяжении всех 4 строчек ни тот, ни другой, в полном согласии с директивой const, вручную не меняются. по тем же соглашениям, *CX и *DX — это регистры, сохраняемые вызывающим, т.е. вызываемая подпрограмма о них заботиться не должна. единственное замечание — указанный код не заработает на процессоре классом ниже *486. впрочем, не думаю, что в наше время кто-то попытается для раскодировки всяческой мультимедии пользовать триставосьмидесятники %) но если уж вдруг, могу предоставить код и для них: procedure CopySwapPixel(const source, destination: Pointer); asm
MOV ECX, [EAX];
XCHG CL, CH;
ROL ECX, 16;
XCHG CL, CH;
ROL ECX, 8;
MOV [EDX], ECX;
end; (была, впрочем, реализация и в три строки, только, к сожалению, забыл принцип, там использовавшийся. пусть уж так. кому они, в конце концов, нужны на десктопах, эти триставосьмидесятники...)
-
У меня почему-то компилятор ругается на директивы {$MODE DELPHI} {$asmmode Intel}
-
> У меня почему-то компилятор ругается на директивы > {$MODE DELPHI} {$asmmode Intel}
возможно, компилятор не тот? =) взгляни на название конференции.
|