_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Zeus hat geschrieben:
Geht das so? Oder muss ich bei glGenTextures eine 2 als ersten Parameter eingeben? Wie würde ich dann beide unterschiedlich auslesen?
Ja, das geht so. Der erste Parameter legt nur fest, wieviele Texturen auf einmal allokiert werden sollen. Daher brauchst du in deinem Fall nur eine 1. Anders wäre es, wenn du mit nur einem glGenTextures-Aufruf dein ganzes array allokieren wolltest, dann müsstest du eine 2 als ersten und den pointer auf das erste array-element als zweiten angeben.
Was meinst du genau mit "unterschiedlich auslesen"?
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Was meinst du genau mit "unterschiedlich auslesen"?
Wenn die erste Lösung richtig war, ist das völlig egal.
Ich dachte nur, er würde 2 Texturen in einem Cardinal speichern, und die würde er ja aufeinmal aufrufen, wenn ich TexID[0] benutze.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Halt
Mir fällt da gerade was auf an deinem Code: du schreibst dort glBindTexture(Erde,...) und nochmal mit Sonne
Das ist falsch.
zunächst gibt es glBindTexture so als befehl nicht. Es gibt aber glBindTexture2D. Und der erste Parameter ist Target, welcher festlegt, was für eine Textur du verwenden willst. Bei glBindTexture2D ist das normalerweise GL_TEXTURE_2D. Deine Aufrufe müssten also folgende sein:
Code:
glPushMatrix();
glTranslatef(0,0,-10);
glBindTexture2D(GL_TEXTURE_2D,TexID[0]);
gluSphere(Sonne,2,520,520);
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,-10);
glRotatef(i,0,1,0);
glTranslatef(0,0,5);
glRotatef(i*20,0,1,0);
glBindTexture2D(GL_TEXTURE_2D,TexID[1]);
gluSphere(Erde,1,520,520);
glPopMatrix();
//Edit:
Ich erklär das am besten nochmal:
Der grund dafür ist, dass OpenGL immer nur eine Textur (es sei denn, man benutzt multitexturing) aktiv haben kann. Die zu verwendende Textur setzt du beispielsweise mit glBindTexture2D. Alle folgenden OpenGL aufrufe verwenden dann diese Textur zum Zeichnen, bis du entweder eine andere bindest oder mit glBindTexture2D(GL_TEXTURE_2D, 0) die textur unbindest.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich weiß nicht was in der glu enthalten ist aber in der dglOpenGL sind eigentlich auch die Glu funktionen enthalten.
Und der Befehl heißt glBindTexture. Da ist nichts mit 2D im Namen.
Außerdem ist das Erstellen der Textur nicht ganz Richtig. Denn nach dem erstellen einer Textur muss dise auch erst einmal an ein Target gebunden werden. Und beim Erstellen ist es besser, wenn du Pointer des Eintrages übergibst und nicht den Eintrag als Pointer castest. Weiß nicht ob es da auch zu Problemen kommen kann aber ich mache so etwas grundsätzlich so.
Wie kann ich denn dann 2 verschiedene Texturen abwechseln zeichnen, ohne sie neu zu laden?
So:
Code:
glPushMatrix();
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D, TexID[0]);
glTexCoord2f(0,0); glVertex3f(-1,-1,0);
glTexCoord2f(0,1); glVertex3f(-1,1,0);
glTexCoord2f(1,1); glVertex3f(1,1,0);
glTexCoord2f(1,0); glVertex3f(1,-1,0);
glEnd;
glPushMatrix();
glBegin(GL_QUADS);
glBindTexture(GL_TEXTURE_2D, TexID[1]);
glTexCoord2f(0,0); glVertex3f(-1,-1,0);
glTexCoord2f(0,1); glVertex3f(-1,1,0);
glTexCoord2f(1,1); glVertex3f(1,1,0);
glTexCoord2f(1,0); glVertex3f(1,-1,0);
glEnd;
geht es nicht, wird alles in TexID[1] gezeichnet, vermutlich weil sie als letztes geladen wurde.
//Edit:
Das
Zitat:
nd beim Erstellen ist es besser, wenn du Pointer des Eintrages übergibst und nicht den Eintrag als Pointer castest. Weiß nicht ob es da auch zu Problemen kommen kann aber ich mache so etwas grundsätzlich so.
habe ich nicht verstanden. Wie wäre denn (anschaulich) die Alternative im Quelltext zu sehen?
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ups... Sowas kommt davon, wenn man gerade keinen eigenen Quelltext zur hand hat.
glBindTexture muss außerhalb von glBegin .. glEnd aufgerufen werden, daher funktioniert dein Code nicht.
also einfach das glBindTextur vors glBegin und dann sollte es langsam gehn.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Habe gerade mal in deinen Beiträgen das Codetag durch das Pascaltag ersetzt. War zu faul unter jedem ein Kommentar einzufügen.
Genau. Das glBindTexture muss außerhalb von glBegin und glEnd stehen. Generell lässt sich sogar sagen, dass nur Eigenschaften eines Vertex innerhalb von glBegin und glEnd gesetzt werden dürfen. Also Farbe, Position via glVertex, Texturkoordinate etc. Alles andere DARF nicht in diesem Block enthalten sein. Falls doch wird der Aufruf meistens stumpf ignoriert. Aber legal ist es trotzdem nicht.
Wenn du eine Textur nicht mehr brauchst und später etwas Texturloses zeichnen möchtest, dann muss du die Textur wieder deaktivieren. Also entweder über ein glBindTexture(GL_TEXTURE_2D, 0) oder glDisable(GL_TEXTURE_2D). Wenn du das Target deaktivierst dann musst du es bei Bedarf aber wieder aktivieren. Sonst sieht du die Textur wieder nicht.
Außerdem solltest du immer darauf achten, dass du zu einem glPushMatrix immer auch ein passendes glPopMatrix hast (Andersrum natürlich genau so). Da du sonst zu viele Matrizen gesichert hast und es keinen Platz mehr gibt. Ergo. Fehler und Langsam. Bzw wenn möglich solltest du glPushMatrix und glPopMatrix auch eher sparsam einsetzen. Also nur dort wo es benötigt wird.
Und was ich bei glGenTextures meinte. Du übergibst ja.
Code:
PGLuint(TexID[0])
Aber genau genommen wird bei PGLuint() der Inhalt als Pointer interpretiert. In dem Falle möchtest du aber den Pointer der Speicherstelle haben. Und dafür ist der Operator @ da.
Code:
@(TexID[0])
Es mag sein, dass das jetzt mit einem Array funktioniert aber spätestens, wenn du eine integer Variable hast wird das ein Problem werden. Deswegen solltest du zwischen Casten (interpretieren) und die tatsächlich Adresse eine Unterscheidung machen. Evtl sieht so etwas der ein oder andere Kompiler auch noch anders.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.