Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Di Jul 15, 2025 21:02

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Textur erzeugen klappt nicht ...
BeitragVerfasst: So Jan 02, 2005 13:20 
Offline
DGL Member

Registriert: So Sep 05, 2004 14:11
Beiträge: 6
Hallo,

ich hoffe ihr seid alle gut gerutscht!!
Ich habe hier ein Problem auf dessen Lösung ich alleine nicht komme!

Ich möchte mittels dieser Prozedur eine Textur anlegen welche ich als Bitmap übergebe:

Code:
  1.  
  2. procedure LoadTextureFromBitmap(bmp:TBitmap; Filter : Boolean; Alpha : Cardinal);
  3. var
  4.  data     : PByteArray;
  5.  i,j,w    : Integer;
  6.  scanline : PByteArray;
  7.  r,g,b,a  : Byte;
  8.  RGBA     : Cardinal;
  9.  
  10. begin
  11.  bmp.PixelFormat:=pf32bit;
  12.  getmem(data,bmp.width*bmp.height*4);
  13.  // Bilddaten kopieren (Upsidedown)
  14.  w:=bmp.Width;
  15.  for i:=0 to bmp.Height-1 do
  16.  begin
  17.    scanline:=bmp.ScanLine[bmp.Height-i-1];
  18.    // Jedes Pixel pro Zeile mit ALPHA-Wert vergleichen
  19.    for j := 0 to (bmp.width-1) do
  20.    begin
  21.      // Bytes laden
  22.      B:=scanline[j*4+0];
  23.      G:=scanline[j*4+1];
  24.      R:=scanline[j*4+2];
  25.      // A:=scanline[j*4+3];
  26.      // RGBA Zusammen kopieren
  27.      RGBA:=R;
  28.      RGBA:=RGBA shl 8;
  29.      RGBA:=RGBA or G;
  30.      RGBA:=RGBA shl 8;
  31.      RGBA:=RGBA or B;
  32.      // RGBA:=RGBA shl 8;
  33.      // RGBA:=RGBA or A;
  34.      // Mit Transparentfarbe vergleichen und ALPHA setzen
  35.      If RGBA=alpha then A:=$00 else A:=$FF;
  36.      scanline[j*4+3]:=A;
  37.    end;
  38.    // in ^data kopieren
  39.    move(scanline^,data^[i*w*4],w*4);
  40.  end;
  41.  
  42.    { Hier liegt wohl mein problem }
  43. // glGenTextures(1, @Texture);
  44. // glBindTexture(GL_TEXTURE_2D, Texture);
  45. // glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); {???}
  46.  
  47.  // Textur in OpenGL erzeugen
  48.  If Filter then begin
  49.                   gltexparameteri(GL_TEXTURE_2D,GL_Texture_min_filter,GL_LINEAR_MIPMAP_LINEAR);
  50.                   gltexparameteri(GL_TEXTURE_2D,GL_Texture_mag_filter,GL_LINEAR);
  51.                 end else begin
  52.                   gltexparameteri(GL_TEXTURE_2D,GL_Texture_min_filter,GL_NEAREST_MIPMAP_NEAREST);
  53.                   gltexparameteri(GL_TEXTURE_2D,GL_Texture_mag_filter,GL_NEAREST);
  54.                 end;
  55.  gluBuild2DMipmaps(GL_TEXTURE_2D, gl_RGBA8, bmp.width, bmp.Height, GL_BGRA, gl_unsigned_byte, data);
  56.  FreeMem(data);
  57. end;
  58.  



Aufrufen tue ich die Prozedur folgender maßen:

Code:
  1.  
  2.  // Schleife durch alle Texturen...case...
  3.     6..99 : Begin
  4.               LoadTexture('textures\tile1.jpg', MapTex[i], False);
  5.               TileList.GetBitmap(i-6,Dummy);
  6.               LoadTextureFromBitmap(Dummy, False, $FFFFFF);
  7.             end;
  8.  


Mein Problem besteht nun darin, das die texturen durch "LoadTextureFromBitmap" nur geladen werden wenn ich
vorher "LoadTexture" aufrufe. Wenn ich das nicht mache bleiben die Texturen einfach weiss. Jetzt habe ich mir
die Texture.pas angeschaut was was dort gemacht wird was ich nicht mache, und zwar ist das:

Code:
  1.  
  2. glGenTextures(1, @Texture);
  3. glBindTexture(GL_TEXTURE_2D, Texture);
  4. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); {???}
  5.  


Ich habe für Texture ein GLUint übergeben, genauso wie das in der texture.pas gemacht wird, aber es funzt ned!!!

Vielleicht kann mir jemand von Euch helfen...
vielen Dank
Ghandi


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Jan 02, 2005 19:28 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Bei meinem Loader sieht das in etwa so aus.
Code:
  1.   // Textur erstellen
  2.   glGenTextures(1, @FTextureID);
  3.  
  4.   // Textur binden. Sonst würden alle anderen Aktionen im Nirvana landern.
  5.   glBindTexture(TextureTarget, TextureID);
  6.  
  7.   // diverse Texturparameter einstellen
  8.   glTexParameter
  9.  
  10.   // Texturdaten zu OpenGL senden.
  11.   // Die Daten wurden vorher schon geladen und wenn nötig aufbereitet.
  12.   gluBuild2DMipmaps(TextureTarget, Comps, Width, Height, Format, GL_UNSIGNED_BYTE, PByte(GetData()))
  13.  


Mich wunder ein wenig (sehr) deine Ladetechnik. Die Methode LoadTexture ist doch die aus der Textures.pas, oder??? Und anschließend lädst du dann noch einmal dein Bild mit deiner Methode? Bzw ich sehe gerade, dass du an dieser Stelle ja nur noch einmal die Bilddaten zur Grafikkarte sendest. Das finde ich alles andere als optimal, wenn du mich fragst. Ideal wäre es eigentlich, wenn du das alles in einem Schritt erledigen würdest. Und nach Möglichkeit, dann nur einmal eine Textur an die Karte senden.

Du müsstest deine Methode so erweitern, dass diese ähnlich wie die LoadTextures eine TexturID nach außen liefert und von alleine eine Textur erstellt. Und dazu sollte ein glGenTextures und glBindTexture schon ausreichen. Wenn dann deine Bilddaten auch noch das richtige Format haben sollte es eigentlich klappen. Oder du steigst auf einen Loader um der diese Möglichkeiten bereits bietet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: das wollte ich ja eigendlich...
BeitragVerfasst: So Jan 02, 2005 20:38 
Offline
DGL Member

Registriert: So Sep 05, 2004 14:11
Beiträge: 6
servus,

das habe ich gerade nochmal probiert. Wenn ich die zeile in der ich
eine textur aus einer Datei lade auskommentiere werden keine texturen
geladen.

Mein Problem ist wohl das ich OpenGL falsch mitteile an welche stelle die
daten aus dem Zeiger geladen werden sollen, bzw. das eine neue textur hinten
angehangen werden soll. Deshalb lade ich erst eine textur aus einer datei, und
überschreibe diese dann mit meinen daten, anders kriege ichs bis jetzt nicht hin.

Die LoadTexture is aus der Texture.pas, das ist richtig, aber eigendlich möchte ich
blos meine Daten zur grafikkarte schicken, weiss eben bloss nicht warum sie die nicht
frisst?

Was ist denn in Deinem code "TextureTarget" ??? Bei mir steht da "GL_TEXTURE_2D" ???

Vielleicht erkennst Du am obigen Text mein Problem...

Danke
Stefan


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]