Registriert seit: 18. Mär 2009
402 Beiträge
|
AW: OpenGL Bitmap für Texttur schnell im Speicher erzeugen
29. Jun 2014, 14:43
so geht's,
allerdings ist die Zeile
texdata[((yHeight)-ly)*xwidth +lx ] := RGBQuad( bmp.canvas.pixels[lx,ly]);
viel zu langsam.
Habe es auch mit TBmp.Scanline[y] probiert.
Ist aber noch langsamer, obwohl man überall liest, scanline sei schneller.
Steh wohl grad auf dem Schlauch
Delphi-Quellcode:
inc(z);
bmp.canvas.Textout(20,20,inttostr(z));
xwidth := bmp.Width-1;
yHeight := bmp.Height-1;
for lx:= 0 to xwidth do begin
for ly := 0 to yHeight do begin
texdata[((yHeight)-ly)*xwidth +lx ] := RGBQuad( bmp.canvas.pixels[lx,ly]);
end;
end;
if TextureID > 0 then glDeleteTextures(1, @TextureID);
glGenTextures(1, @ textureid);
glBindTexture(GL_TEXTURE_2D, cardinal(textureid) );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_linear);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_linear);
glTexImage2D(GL_TEXTURE_2D, 0, 3, xwidth, yHeight, 0,
GL_RGBA, GL_UNSIGNED_BYTE, @texdata);
hier die Version mit Scanline[y] - noch langsamer.
Was kann man tun ? API-Version ?
Delphi-Quellcode:
inc(z);
bmp.canvas.Textout(20,20,inttostr(z));
xwidth := bmp.Width;
yHeight := bmp.Height;
for y := 0 to yHeight-1 do begin
l_ptr:=bmp.ScanLine[y];
for x := 0 to xwidth-1 do begin
l_r:= l_ptr.rgbBlue;
l_ptr.rgbBlue:=l_ptr.rgbRed;
l_ptr.rgbRed:=l_r;
texdata[((yHeight-1)-y)*xwidth+x] := l_ptr^;
inc(l_ptr);
end;
end;
if TextureID > 0 then glDeleteTextures(1, @TextureID);
glGenTextures(1, @ textureid);
glBindTexture(GL_TEXTURE_2D, cardinal(textureid) );
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_linear);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_linear);
glTexImage2D(GL_TEXTURE_2D, 0, 3, xwidth, yHeight);
Geändert von luisk (29. Jun 2014 um 16:00 Uhr)
|
|
Zitat
|