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

Aktuelle Zeit: Sa Dez 21, 2024 18:17

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



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: [solved] Problem mit glBindTexture
BeitragVerfasst: Sa Mai 16, 2015 18:09 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
Hallo Community,
ich habe ein Problem beim Aufrufen von glBindTexture.
Ich versuche mehrere Materials zu rendern, welche jeweils eine andere Textur besitzen. Jedoch funktioniert der unten einfgefügte Code nicht, es wird immer nur die Textur an der Stelle [0] des arrays angezeigt.

Verwende ich anstatt "Texture[TRXObjects[i].MatID])" nur "Texture[0])" oder "Texture[1]" funktioniert alles ohne Probleme, jedoch sind dann wieder alle Objekte gleich Texturiert.

Es sei gesagt, dass "Texture" ein array des Typs GLUint ist, welcher erfolgreich mit Texturen geladen wurde.

Code:
  1. glBegin(GL_TRIANGLES);
  2. for i:=0 {TRXLOD[0].FirstObj} to 1 {TRXLOD[0].FirstObj+TRXLOD[0].NumObj-1} do begin
  3.  glBindTexture(GL_TEXTURE_2D, Texture[TRXObjects[i].MatID]);
  4.  for j:=FirstFace[i] to FirstFace[i]+TRXObjects[i].FaceCount-1 do
  5.   for k:=3 downto 1 do begin
  6.     glColor3f(GetRValue(MTL[TRXObjects[i].MatID].Diffuse),
  7.               GetGValue(MTL[TRXObjects[i].MatID].Diffuse),
  8.               GetBValue(MTL[TRXObjects[i].MatID].Diffuse));
  9.     glTexCoord2fv(@TRXPoints[TRXFaces[j,k]].U2);
  10.     glNormal3f(TRXPoints[TRXFaces[j,k]].nX/128-1,
  11.                TRXPoints[TRXFaces[j,k]].nY/128-1,
  12.                TRXPoints[TRXFaces[j,k]].nZ/128-1);
  13.     glVertex3fv(@TRXPoints[TRXFaces[j,k]].X);
  14.   end;
  15.  end;
  16. glEnd;


Um mögliche Zuweisungsfehler auszuschließen habe ich hier die Indexe von TRXObjects[i].MatID (links) und Texture[i] (rechts) angehängt:
Bild

Ich hoffe, ich konnte mein Problem einigermaßen verständlich darstellen.
Grüße aus Ghana


Zuletzt geändert von 8.zwerg am So Mai 17, 2015 12:04, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit glBindTexture
BeitragVerfasst: Sa Mai 16, 2015 19:46 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 05, 2013 15:12
Beiträge: 166
Wohnort: Glinde
Programmiersprache: Delphi 7
Ich sehe gerade den Punkt gar nicht, wo die Textur, wenn sie nicht mehr gebraucht wird, entladen wird.

Bei mir sieht der Code ungefähr so aus.

interfacepack.Bind();
IFU_Interface_Icon_Draw;
interfacepack.unBind();

Kann es sein, dass die Textur bei dir deshalb stecken bleibt?

Code:
  1.    
  2. glBegin(GL_TRIANGLES);
  3.   for i:=0 {TRXLOD[0].FirstObj} to 1 {TRXLOD[0].FirstObj+TRXLOD[0].NumObj-1} do begin
  4.     glBindTexture(GL_TEXTURE_2D, Texture[TRXObjects[i].MatID]);
  5.       for j:=FirstFace[i] to FirstFace[i]+TRXObjects[i].FaceCount-1 do
  6.         for k:=3 downto 1 do begin
  7.           glColor3f(GetRValue(MTL[TRXObjects[i].MatID].Diffuse),
  8.                     GetGValue(MTL[TRXObjects[i].MatID].Diffuse),
  9.                     GetBValue(MTL[TRXObjects[i].MatID].Diffuse));
  10.           glTexCoord2fv(@TRXPoints[TRXFaces[j,k]].U2);
  11.           glNormal3f(TRXPoints[TRXFaces[j,k]].nX/128-1,
  12.                      TRXPoints[TRXFaces[j,k]].nY/128-1,
  13.                      TRXPoints[TRXFaces[j,k]].nZ/128-1);
  14.           glVertex3fv(@TRXPoints[TRXFaces[j,k]].X);
  15.        end;
  16.  
  17.    //unbind 
  18.  
  19.   end;
  20. glEnd;
  21.  

_________________
幸福は笑う人に来て ~~ koufuku wa warau hito ni kite
Das Glück kommt zu denen die lachen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit glBindTexture
BeitragVerfasst: Sa Mai 16, 2015 22:11 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
Ist es denn überhaupt nötig, die Texturzuweisung zu löschen?
Zum einen wird glBindTexture doch solange benutzt, bis eine neue Textur (wie in meinem Fall) zugewiesen wird oder die Textur mit glDisable() wieder deaktiviert wird. (Oder? siehe auch hier glBindTexture)

Kannst du mir trotzdem erklären, wie du dir das entladen vorstellst? Mir ist da nur glDeleteTexture bekannt, aber danach muss ich ja die Textur komplett neu laden.
Abgesehen davon, dass ich davon keine Ahnung habe, dachte ich immer, dass es sinnvoller wäre, wenn man Texturen zu beginn einmalig lädt und nicht jedes Mal neu in der Renderschleife. Kostet das dann nicht auch extrem viel Rechenleistung?
Ich benutze übrigens keinen fertigen Texture-loader, da ich ein spezielles Bildformat als Textur habe.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit glBindTexture
BeitragVerfasst: So Mai 17, 2015 00:44 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Jun 05, 2013 15:12
Beiträge: 166
Wohnort: Glinde
Programmiersprache: Delphi 7
Da ich selber nicht alles 100% verstehe, aber dir zumindestens weiter helfen möchte, zeig ich dir mal meinen Code.

Ich habe allerdings den Texturloader glBitmap benutzt.

Code:
  1. uses glBitmap;


//Als erstes wird die Textur bei mir einmalig geladen... (Programmstart)
Code:
  1. var
  2.   Interfacepack :TglBitmap2D;
  3.    
  4.    //Die Textur ist ein komplettes Packet aller meiner Interfacebausteine 
  5.   try
  6.     Interfacepack := TglBitmap2D.Create; // Instanz der Klasse erstellen
  7.     Interfacepack.LoadFromFile(Datei); // Datei laden
  8.     Interfacepack.GenTexture; // geladene Textur an OpenGL übergeben
  9.   except
  10.     fehlertext('Textur konnte nicht geladen werden : '+Datei);
  11.   end;


Anschließend Rendere ich dann alles was ich brauche.
Bind und Unbind stammen bei mir aus der TglBitmap2D
Code:
  1. interfacepack.Bind();  
  2.   //hier zwischen stehen alle aufrufe
  3. interfacepack.unbind();


Nach dem Tutorial hast du recht. Selbst beim glBitmap - Texturenloader steht:
Zitat:
Sollte man die Textur einmal nicht mehr benutzen wollen so genügt es entweder eine andere Textur zu binden oder Unbind von der Texturenklasse aufzurufen.


Und beim Blick in die Eingeweide fand ich dann:

Code:
  1. procedure TglBitmap.Unbind(const aDisableTextureUnit: Boolean);
  2. begin
  3.   if aDisableTextureUnit then
  4.     glDisable(Target);
  5.   glBindTexture(Target, 0);
  6. end;


Nun Frage ich mich natürlich auch: "Warum überhaupt unbind".
Denn damit bekomme ich nur eine nackte Fläche.
Die ich sofort wieder mit der nächsten XXL Texture neu binde.


Auf die Frage "viel Rechenleistung" sagte man mir:
"Benutze nicht 200 einzelne Texturen. Baue dir eine Megatexturen und binde sie."
Deshalb benutze ich heute 5 Stück in jedem Durchlauf. Hat bei mir einiges gebracht.

Es tut mir leid, dass ich dir wohl nicht weiterhelfen kann.

_________________
幸福は笑う人に来て ~~ koufuku wa warau hito ni kite
Das Glück kommt zu denen die lachen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit glBindTexture
BeitragVerfasst: So Mai 17, 2015 00:48 
Offline
Ernährungsberater
Benutzeravatar

Registriert: Sa Jan 01, 2005 17:11
Beiträge: 2067
Programmiersprache: C++
8.zwerg hat geschrieben:
Ist es denn überhaupt nötig, die Texturzuweisung zu löschen?
Zum einen wird glBindTexture doch solange benutzt, bis eine neue Textur (wie in meinem Fall) zugewiesen wird oder die Textur mit glDisable() wieder deaktiviert wird. (Oder? siehe auch hier glBindTexture)

Ja, die Textur bleibt erhalten (-> state machine)

_________________
Steppity,steppity,step,step,step! :twisted:
❆ ❄ ❄ ❄ ❅ ❄ ❆ ❄ ❅ ❄ ❅ ❄ ❅ ❄ ❄
❄ ❄ ❄ ❅ ❄ ❄ ❄ ❅ ❄ ❄ ❆ ❄ ❄


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit glBindTexture
BeitragVerfasst: So Mai 17, 2015 00:57 
Offline
DGL Member

Registriert: Mi Sep 15, 2010 18:22
Beiträge: 59
Wohnort: Sachsen Meißen
Programmiersprache: Pascal, C(++), Java
Ich denke, der Fehler liegt beim Aufruf von glBindTexture innerhalb eines glBegin/End-Block.

_________________
bluesky


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Problem mit glBindTexture
BeitragVerfasst: So Mai 17, 2015 12:01 
Offline
DGL Member

Registriert: Sa Mai 16, 2015 17:25
Beiträge: 22
Programmiersprache: Pascal
aha...

Habe gerade nocheinmal glBindTexture außerhalb des glBegin/glEnd Blockes gesetzt, es funktioniert.

Vielen Dank.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Mai 17, 2015 17:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 31, 2002 19:41
Beiträge: 1278
Wohnort: Bäretswil (Schweiz)
Programmiersprache: Pascal
Zitat:
Ich denke, der Fehler liegt beim Aufruf von glBindTexture innerhalb eines glBegin/End-Block.


Im Wiki steht es, das dies untersagt ist.
Code:
  1. GL_INVALID_OPERATION wird generiert, wenn glBindTexture in einem glBegin/glEnd-Block aufgerufen wird.


http://wiki.delphigl.com/index.php/glBindTexture

_________________
OpenGL


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 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.011s | 15 Queries | GZIP : On ]