Das stammt aus meiner noch nicht veröffentlichten OpenGLGraphikEngine.pas, evtl hilft es dir ja ein bischen
Code: Alles auswählen
Function TGraphikEngine.LoadGraphik(Const Graphik: TBitmap; name: String; Stretch: TStretchmode = smNone): Integer; overload; // Laden einer Graphik ohne Alphakanal
Var
OpenGLData: Array Of Array[0..2] Of Byte;
Data: String;
b, b2: Tbitmap;
{$IFDEF FPC}
IntfImg1: TLazIntfImage;
CurColor: TFPColor;
{$ELSE}
p: PBGR;
{$ENDIF}
c, j, i: Integer;
bool: {$IFDEF USE_GL}Byte{$ELSE}Boolean{$ENDIF};
ow, oh, nw, nh: Integer;
Begin
Data := LowerCase(name);
// Graphik bereits geladen
For i := 0 To high(Fimages) Do
If Fimages[i].Name = Data Then Begin
result := Fimages[i].Image;
exit;
End;
// Graphik mus geladen werden
b := Graphik;
b.PixelFormat := pf24bit;
{$IFDEF FPC}
// create the raw image
IntfImg1 := TLazIntfImage.Create(0, 0);
{$ENDIF}
nw := b.width;
nh := b.height;
ow := b.width;
oh := b.height;
Case Stretch Of
smNone: Begin
End;
smStretch: Begin
nw := GetNextPowerOfTwo(b.width);
nh := GetNextPowerOfTwo(b.height);
If (nw <> b.width) Or (nh <> b.height) Then Begin
b2 := TBitmap.create;
b2.PixelFormat := pf24bit;
b2.width := nw;
b2.height := nh;
b2.canvas.StretchDraw(rect(0, 0, nw, nh), b);
b.Width := nw;
b.height := nh;
b.canvas.draw(0, 0, b2);
b2.free;
End;
End;
smClamp: Begin
nw := GetNextPowerOfTwo(b.width);
nh := GetNextPowerOfTwo(b.height);
If (nw <> b.width) Or (nh <> b.height) Then Begin
b2 := TBitmap.create;
b2.PixelFormat := pf24bit;
b2.width := nw;
b2.height := nh;
b2.canvas.Draw(0, 0, b);
b.Width := nw;
b.height := nh;
b.canvas.draw(0, 0, b2);
b2.free;
End;
End;
End;
{$IFDEF FPC}
// load the raw image from the bitmap handles
IntfImg1.LoadFromBitmap(B.Handle, B.MaskHandle);
{$ENDIF}
If IsPowerOfTwo(b.width) And IsPowerOfTwo(b.Height) Then Begin
// Laden der Graphikdaten
setlength(opengldata, b.width * b.height);
c := 0;
For j := 0 To b.height - 1 Do Begin
{$IFNDEF FPC}
p := b.ScanLine[j];
{$ENDIF}
For i := 0 To b.width - 1 Do Begin
{$IFNDEF FPC}
OpenGLData[c, 0] := p^.r;
OpenGLData[c, 1] := p^.g;
OpenGLData[c, 2] := p^.b;
inc(p);
{$ELSE}
CurColor := IntfImg1.Colors[i, j];
OpenGLData[c, 0] := CurColor.Red Div 256;
OpenGLData[c, 1] := CurColor.green Div 256;
OpenGLData[c, 2] := CurColor.blue Div 256;
{$ENDIF}
inc(c);
End;
End;
// Übergeben an OpenGL
glGenTextures(1, @Result);
bool := glIsEnabled(GL_TEXTURE_2D);
If Not (Bool{$IFDEF USE_GL} = 1{$ENDIF}) Then
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D, result);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, gl_RGB, b.width, b.height, 0, GL_RGB, GL_UNSIGNED_BYTE, @OpenGLData[0]);
If Not (Bool{$IFDEF USE_GL} = 1{$ENDIF}) Then
gldisable(GL_TEXTURE_2D);
{$IFDEF FPC}
IntfImg1.free;
b := Nil;
{$ENDIF}
// Übernehmen in die Engine
setlength(Fimages, high(Fimages) + 2);
Fimages[high(Fimages)].Image := Result;
Fimages[high(Fimages)].Name := data;
Fimages[high(Fimages)].Stretched := stretch;
Fimages[high(Fimages)].OrigWidth := ow;
Fimages[high(Fimages)].OrigHeight := oh;
Fimages[high(Fimages)].StretchedWidth := nw;
Fimages[high(Fimages)].StretchedHeight := nh;
End
Else
Raise Exception.create('Error Image ' + extractfilename(name) + ' has invalid Width / Height, has to be 2^x.');
End;