-
function LoadTGATexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;
var
TGAHeader : packed record 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;
ResStream : TResourceStream;
procedure CopySwapPixel(const Source, Destination : Pointer);
asm
push ebx
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
end;
begin
result :=FALSE;
GetMem(Image, 0);
if LoadFromResource then begin
try
ResStream := TResourceStream.Create(hInstance, PChar(copy(Filename, 1, Pos('.', Filename)-1)), 'TGA');
ResStream.ReadBuffer(TGAHeader, SizeOf(TGAHeader)); result :=TRUE;
except on
EResNotFound do
begin
MessageBox(0, PChar('File not found in resource - ' + Filename), PChar('TGA Texture'), MB_OK);
Exit;
end
else
begin
MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
Exit;
end;
end;
end
else
begin
AssignFile(TGAFile, Filename);
Reset(TGAFile, 1);
BlockRead(TGAFile, TGAHeader, SizeOf(TGAHeader));
result :=TRUE;
end;
-
if Result = TRUE then
begin
Result :=FALSE;
if (TGAHeader.ImageType <> 2) AND
(TGAHeader.ImageType <> 10) then
begin
Result := False;
CloseFile(tgaFile);
MessageBox(0, PChar('Couldn''t load \"'+ Filename +'\". Only 24 and 32bit TGA supported.'), PChar('TGA File Error'), MB_OK);
Exit;
end;
if TGAHeader.ColorMapType <> 0 then
begin
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t load "'+ Filename +'". Colormapped TGA files not supported.'), PChar('TGA File Error'), MB_OK);
Exit;
end;
// Get the width, height, and color depth
Width := TGAHeader.Width[0] + TGAHeader.Width[1] * 256;
Height := TGAHeader.Height[0] + TGAHeader.Height[1] * 256;
ColorDepth := TGAHeader.BPP;
ImageSize := Width*Height*(ColorDepth div 8);
if ColorDepth < 24 then
begin
Result := False;
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
if LoadFromResource then // Load from resource
begin
try
ResStream.ReadBuffer(Image^, ImageSize);
ResStream.Free;
except
MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
Exit;
end;
end
else // Read in the image from file
begin
BlockRead(TGAFile, image^, ImageSize, bytesRead);
if bytesRead <> ImageSize then
begin
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
Exit;
end
end;
// TGAs are stored BGR and not RGB, so swap the R and B bytes.
// 32 bit TGA files have alpha channel and gets loaded differently
if TGAHeader.BPP = 24 then
begin
for I :=0 to Width * Height - 1 do
begin
Front := Pointer(Integer(Image) + I*3);
Back := Pointer(Integer(Image) + I*3 + 2);
Temp := Front^;
Front^ := Back^;
Back^ := Temp;
end;
Texture :=CreateTexture(Width, Height, GL_RGB, Image);
end
else
begin
for I :=0 to Width * Height - 1 do
begin
Front := Pointer(Integer(Image) + I*4);
Back := Pointer(Integer(Image) + I*4 + 2);
Temp := Front^;
Front^ := Back^;
Back^ := Temp;
end;
Texture :=CreateTexture(Width, Height, GL_RGBA, Image);
end;
end;
// Compressed 24, 32 bit TGA files
if TGAHeader.ImageType = 10 then
begin
ColorDepth :=ColorDepth DIV 8;
CurrentByte :=0;
CurrentPixel :=0;
BufferIndex :=0;
if LoadFromResource then // Load from resource
begin
try
GetMem(CompImage, ResStream.Size-sizeOf(TGAHeader));
ResStream.ReadBuffer(CompImage^, ResStream.Size-sizeOf(TGAHeader)); // load compressed date into memory
ResStream.Free;
except
MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
Exit;
end;
end
else
begin
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
Result := False;
CloseFile(TGAFile);
MessageBox(0, PChar('Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
Exit;
end
end;
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 ColorDepth = 3 then
Texture :=CreateTexture(Width, Height, GL_RGB, Image)
else
Texture :=CreateTexture(Width, Height, GL_RGBA, Image);
end;
Result :=TRUE;
FreeMem(Image);
end;
end;
-
ХМ TGA уже поддерживает альфу просто тебе нужен нормальный редактор для графики, ИМХО лудше всего с альфой работает GIMP... А тот способ который я предлагал в TGA не всунеш =) Дай лудше ICQ....
-
Jkot © (05.06.07 04:15) [42]
Где его можно скачать
-
Скачал и установил GIMP 2. Как правильно сделать хотя бы простой шрифт для игры?
-
Хм впринципе можно сделать так: Береш генератор для шрифтов, я те в другой теме дал, потом грузиш шрифт, потом на слое жмёш "Добавить маску слоя" выбираеш "копия слоя в оттенках серого" , жмеш там же применить маску слоя, дальше сохраняеш в TGA, всё точно будет альфа... Дальше пробуй выводить там тот генератор ещё создаёт доп файл, если что я скажу как этим файлом пользоватся....
-
Почему этот код работает неправильно
procedure Begin_Intro;
begin
draw2d.RENDERING_BEGIN;
draw2d.BEGIN_2D;
sprite.Fill(0,0,1024,768,1,1,1,1, company);
draw2d.WRITE(100,200,'Stroka1');
draw2d.WRITE(100,300,'Stroka2');
draw2d.WRITE(200,400,PChar('FPS: ' + inttostr(engine.FPS)));
draw2d.WRITE(100,300,'Stroka3');
sprite.mouse(input.X,input.Y,30,30,1,1,1,1, m);
draw2d.END_2D;
draw2d.RENDERING_END;
end;
Такой же код в модуле меню работает правильно. :(((((( Не пойму почему Stroka1, Stroka2 выводится цветом который установлен в процедуре
procedure TDraw2D.WRITE(X, Y: GLUint; text : PChar);
var
TexID: Cardinal;
begin
glColor3ub(0,0,250);
glPopMatrix;
glBindTexture(GL_TEXTURE_2D, texID); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_BLEND );
Y := eH-Y;
glRasterPos2i(X, Y);
glPushAttrib(GL_LIST_BIT);
glListBase(baseFont);
glCallLists(length(text), GL_UNSIGNED_BYTE, text);
glPopAttrib();
glPopMatrix;
end;
А строка PChar('FPS: ' + inttostr(engine.FPS)) выводится чёрным и на фоновой картинке не видно Почему чёрный цвет в этой и следующих строках? И почему весь текст становится чёрного цвета если убрать следующие строки.
glBindTexture(GL_TEXTURE_2D, texID); glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glEnable( GL_BLEND );
ps. С текстурным шрифтом покачто ничего неполучается наверно неправильный код рисование этих текстурных шрифтов :(((( Что делать ? :(
-
Ломал голову весь день. Потом решил удалить везде в модулях рисования спрайтов и шрифтов команду установки цвета. glColor3ub(250,250,250); И всё заработало . :) Теперь цвет ришил устанавливать в самой программе.
У меня такой вопрос. Как привильно использовать команды glPushMatrix; glPopMatrix; Где и зачем их использовать. Я знаю только то что первія помещяет в матрицу а вторая типа вітаскивет чтото. Объясните пожалуйста. Зарание благодарю :)
-
Дык ты 1 раз устанавливаеш цвет и он действует на все обьекты пока ты не смениш го ещё разок....
glPushMatrix; glPopMatrix;
Push сохраняет матрицу а Pop загружает.... хм например нужно расположить 2 обьекта один в [40;100] а другой в [90;200] можно сделать так:
move[40;100] draw1; move[50;100] draw2;
т.е движение складывается между собой + есть такая особенность что когды ты обьект покрутил то следуешее движение будет происходить уже относительно угла поворота, и все последующие обьекты буду рисоватся с тем же поворотом....
Поэтому шоб немучицца с этим всем делай так:
glPushMatrix; move[40;100] draw1; glPopMatrix;
glPushMatrix; move[90;200] draw2; glPopMatrix;
И ттогды все обьекты будут в координатах относительно [0;0]
-
Jkot © (10.06.07 03:58) [48]
Спасибо за совет
-
Удалено модератором
-
Кстати, в модуле загрузки текстуры выше приведенном я вижу GetMem и ни одного FreeMem. Так и задумано?
Ну и таки для того что бы пользоваца готовыми графическими движками надо знать хоть примерно как они работают. Для этого надо хотя бы попытаца написать свой. Аффтар на верном пути. Аффтар, почитай книгу М. Краснова. Графика OpenGL в проектах дельфи. Стоит она недорого благо. Если совсем с деньгами напряг то в инете лежит. Например можешь порыть, где та была на D3Dengine.narod.ru . И настоятельно рекомендую порыть сорсы Jan Horn. Толково написано.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|