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

Aktuelle Zeit: Fr Jul 18, 2025 12:10

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 3 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Zwei Probleme mit Texturen
BeitragVerfasst: So Sep 14, 2003 18:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
Hi!
Ich hab folgende Probleme:
1)
Ich speicher in einer Liste mehrere Objekte, die ein dyn. Array mit Texturen enthalten.
Zum testen hat jedes Objekt zwei Texturen.
Das funktioniert auch wunderbar, das mit den Listen, aber:
Die erste Textur hat immer die gleiche ID!
Bei mir sieht das so aus:
Objekt1: Textur1(ID): 3
Objekt1: Textur2(ID): 4
Objekt2: Textur1(ID): 3
Objekt2: Textur2(ID): 5
Das komische ist, dass die 2. Textur immer eine korrekte ID hat.

2)
Ich verwende ja zwei Texturen. Die hol ich mit Multitexturing auf das Objekt. Es wird aber nur die zweite Textur angezeigt. Die erste wird scheinbar überschrieben.

3)
Manchmal hab ich bei einem Objekt nur eine Textur.
Ich verwende dann trotzdem Multitexturing, und dabei kommt dann eine Textur mit folgender Pixelanordnung raus:
ROT GELB BLAU ROT GELB BLAU ROT GELB BLAU ROT GELB BLAU
ROT GELB BLAU ROT GELB BLAU ROT GELB BLAU ROT GELB BLAU
...

Der Code (nur die wichtigen teile):
Code:
  1.  
  2.   //Hier werden die Texturen geladen
  3.   procedure AddMaterial(material:PMaterial);
  4.   var pdata:pointer;
  5.       i:integer;
  6.   begin
  7.     if PMaterial(material).num_textures  > 0 then
  8.     begin
  9.       for i := 0 to PMaterial(material).num_textures-1 do
  10.       begin
  11.         PData := PMaterial(material).texture[i].ScanLine[PMaterial(material).texture[i].height-1];
  12.         if Assigned(pdata) then
  13.         begin
  14.           glGenTextures(1,@PMaterial(material).gltex[i]);
  15.           glBindTexture(GL_TEXTURE_2D, PMaterial(material).gltex[i]);
  16.           glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
  17.           glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
  18.           gluBuild2DMipmaps(GL_TEXTURE_2D, 3, PMaterial(material).texture[i].Width, PMaterial(material).texture[i].Height, GL_BGR, GL_UNSIGNED_BYTE, pData);
  19.         end;
  20.         frmMain.Outconsole('Generated Texture ID: '+IntToStr(PMaterial(material).gltex[i]));
  21.       end;
  22.     end;
  23.     materials.Add(material);    
  24.   end;
  25.  
  26. //Zuweisen der Texturen (beim zeichnen)
  27.           for j := 0 to PMaterial(materials.Items[PMesh(meshes.Items[nmesh]).groups[i].material]).num_textures-1 do
  28.           begin
  29.             glEnable(GL_TEXTURE_2D);
  30.             glActiveTextureARB(GL_TEXTURE0_ARB+j);
  31.             glBindTexture(GL_TEXTURE_2D,PMaterial(materials.Items[PMesh(meshes.Items[nmesh]).groups[i].material]).gltex[j]);
  32.             glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
  33.           end;
  34.           glActiveTextureARB(GL_TEXTURE0_ARB);
  35.           glEnable(GL_TEXTURE_2D);
  36.           glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
  37.           for j := 0 to PMaterial(materials.Items[PMesh(meshes.Items[nmesh]).groups[i].material]).num_textures-2 do
  38.           begin
  39.             glActiveTextureARB(GL_TEXTURE0_ARB+j);
  40.             glBindTexture(GL_TEXTURE_2D,PMaterial(materials.Items[PMesh(meshes.Items[nmesh]).groups[i].material]).gltex[j]);
  41.           end;
  42.  
  43. //Zuweisen der Texturenkoordinaten (beim zeichnen)
  44.           for k := 0 to PMaterial(materials.Items[PMesh(meshes.Items[nmesh]).groups[i].material]).num_textures-1 do
  45.              glMultiTexCoord2fARB(GL_TEXTURE0_ARB+k,
  46.                                   PMesh(meshes.Items[nmesh]).groups[i].vertices[j].u,
  47.                                   PMesh(meshes.Items[nmesh]).groups[i].vertices[j].v);
  48.  


Den richtigen Renderingcontext hab ich jedesmal mit wglMakeCurrent ausgewählt.
Ich hoffe, es kann mir jemand helfen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Sep 14, 2003 19:51 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
zu 1. :
Bin mir fast sicher, das du da mit deinen Pointer nicht so umgehst wie man soll.Zum einen referenzierst du diese nicht mit einem ^ (was unter neuen Delphi-Versionen allerdings kein Problem macht, jedoch nicht Pascal-konform ist), und zum anderen übergibst du glGenTextures mittels @PMaterial(material).gltex[i] einen Pointer auf einen Pointer, was falsch ist.Evtl. liegt dein Problem da, aber da ich den Rest deines Codes nicht kenne, musst du da wohl selbst testen.

zu 2. :
Ist ja auch logisch, da jede TMU beim Start auf GL_REPLACE gesetzt wird, und so das Ergebnis der ersten TMU überschrieben wird.Ändern tust du den Kombinationsmodus so :
Code:
  1. glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, KombinationsModus);

Wobei KombinationsModus wie der Name vermuten lässt die Art und Weise ist, auf die der Pixelwert der aktuellen TMU mit dem der vorangehenden TMU verknüpft wird.Hier sind z.B. GL_ADD, GL_REPLACE, GL_MODULATE uvm. möglich.Schau dir dazu am besten ein Tut an, in dem diese Funktionen näher erklärt werden.

zu 3. :
Anscheinend wurde auf der nicht genutzten TMU eine fehlerhafte Textur (oder gar keine) gebunden.Wenn du eine TMU nicht nutzen willst, dann musst du sie halt mit glDisable(GL_TEXTURE_2D) deaktivieren.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Sep 15, 2003 16:56 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 25, 2003 12:44
Beiträge: 29
Das mit dem Multitexturing hab ich wie in deinem Tut gemacht (da hab ich das auch gelernt...).
Nur die Texturen hab ich nicht wieder ausgeschaltet... Das war der Fehler!

Das mit @PMaterial(material).gltex[i] ist einleuchtend... Wie dumm von mir. :roll:
Aber wenn ich das @ weglasse kommt der Fehler "Inkompatible Typen: Cardinal und PGLuint".
Auch dann, wenn ich das umwandle!!!


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 » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 5 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 16 Queries | GZIP : On ]