Einfache OpenGL-textur-map nicht funktioniert?
Ich versuche, herauszufinden, texture mapping in OpenGL und ich kann nicht ein einfaches Beispiel, um zu arbeiten.
Das polygon wird gezeichnet, wenn es nicht strukturiert, sondern nur eine Feste Farbe. Auch die bitmap geladen wird korrekt in sprite1[] wie ich war erfolgreich mit glDrawPixels bis jetzt.
Benutze ich glGenTextures, um meine tex-Namen, aber ich merke, es ändert sich nicht texName1; diese GLuint ist, was ich initialisieren, auch nach dem Aufruf von glGenTextures...
Habe ich aktiviert GL_TEXTURE_2D.
Hier ist der code:
GLuint texName1 = 0;
glGenTextures(1, &texName1);
glBindTexture(GL_TEXTURE_2D, texName1);
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, sprite1[18], sprite1[22], 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, &sprite1[54]);
glColor3f(1, 1, 0);
glBindTexture(GL_TEXTURE_2D, texName1);
glBegin(GL_QUADS);
glTexCoord2f (0.0, 0.0);
glVertex3f (0.0, 0.0, -5.0f);
glTexCoord2f (1.0, 0.0);
glVertex3f (.5, 0.0, -5.0f);
glTexCoord2f (1.0, 1.0);
glVertex3f (.5, .5, -5.0f);
glTexCoord2f (0.0, 1.0);
glVertex3f (0.0, .5, -5.0f);
glEnd();
UPDATE:
Ich bin an einem Verlust. Hier ist alles, was ich versucht habe:
-
Stellt sich heraus, ich war der Initialisierung meiner textur vor OGL initialisiert wurde. Die textur ist initialisiert (glGenTextures->glTexImage2D) in einer Klasse-Konstruktor und gezeichnet (glBegin->glEnd) in einer member-Funktion in jedem Bild aufgerufen. genTextures scheint zu funktionieren jetzt richtig und ich bin immer ein name des 1.
-
Jede mögliche Kombination von GL_RGBA8, GL_BGRA_EXT (GL_BGRA funktioniert nicht auf meinem system, ich brauche das _EXT), und ich selbst, entfernt den Alphakanal aus der bitmap und versucht, alle Kombinationen von GL_RGB, GL_BGR_EXT, etc etc. Kein Glück.
-
Versucht prozedural erstellen einer bitmap verwendet wird,
-
Sicher GL_COLOR_MATERIAL nicht aktiviert ist.
-
Geändert bitmap-Größe auf 32x32.
-
Versucht glTexEnvi statt glTexEnvf.
- wenn texName1 ist übrigen 0 nach glGenTextures Sie sollten überprüfen, Ihre Fehler Bedingungen...
- Ist die Breite & height gespeichert, wie byte oder int in sprite1[]?
- Breite und Höhe werden als byte little endian. Ich habe sprite1[18] und sprite1[22] erfolgreich vor, mit glDrawPixels; Sie sind korrekt. Die bitmap wird nur 29x20 Pixel, damit es funktioniert.
- Auch, wie kann ich prüfen, ob Fehlerzustände? Aus den Referenz-Seiten, die ich nicht sehe, dass glGenTextures Fehler generiert, das nützlich sein würde, um mich mit glGetError().
Du musst angemeldet sein, um einen Kommentar abzugeben.
Neben mentat Hinweis, dass Sie vielleicht ein problem mit non-power-of-two textur Abmessungen, die Sie erwähnen, die textur-Generierung von Namen nicht den Namen ändern.
Das klingt so, als wenn Sie anrufen
glGenTextures()
zu früh, also vor dem initialisieren von OpenGL. Wenn du es nicht bist, dann schlage ich vor, das hinzufügen von code nach dem Aufruf vonglGenTextures()
Sie, dass der check der OpenGL-Fehler-Zustand, durch den AufrufglGetError()
.Ihre Kommentare, sagen Sie Ihr bitmap ist 29x20 Pixel. Afaik zum generieren einer gültigen textur, OpenGL erfordert, dass die Größe des Bildes (auf jeder dimension), die einer Potenz von 2. Sie nicht brauchen, um ein Quadrat, es kann ein Rechteck sein, obwohl. Können Sie überwinden diese, indem Sie einige OpenGL-Erweiterungen wie GL_ARB_texture_rectangle.
Werde ich das hier, da hatte ich das gleiche Problem und fand einen anderen post, der erklärt, das Problem.
Das iPhone unterstützt GL_BGRA(GL_EXT_BGRA), aber scheinbar nur als input-format und nicht als ein internes format. Also, wenn Sie ändern Sie den Aufruf von glTexImage2D haben ein internes format von GL_RGBA, dann funktioniert es.
Ich hoffe, dies hilft jemand, der auf stolpert auf diesen post.
Einige zufällige Ideen:
Zur Fehlerprüfung empfehle ich das schreiben einer kleinen Funktion druckt eine lesbare Ausgabe für die häufigsten Ergebnisse von glGetErrors und verwenden, finden Sie die Zeile, die den Fehler verursacht. Eine andere Möglichkeit wäre die Verwendung von etwas wie GLIntercept, BuGLe oder gDEBugger.
Meine OpenGL ist rostig, aber ich erinnere mich, dass Sie dieselben Probleme mit sich wie mit
glTexImage2D
. Endlich habe ich es geschafft, damit es funktioniert, aber ich hatte immer mehr Glück mit
gluBuild2DMipmaps
so landete ich mit
ersetzt
Habe das problem gefunden. Mein Aufruf
glEnable
warglEnable(GL_BLEND | GL_TEXTURE_2D)
. Mit glGetError ich sah, ich war immer ein GL_INVALID_ENUM für dieses Gespräch, also zog ich GL_TEXTURE_2D, um seinen eigenen enable-Funktion und bingo. Ich denke, das logische ODER ist nicht zulässig für glEnable?Erste, was ich überprüfen würde ist die Farbe, die material einstellen, wie erwähnt, durch ShadowIce, dann überprüfen Sie Ihre textur-Datei, um sicherzustellen, es ist eine vernünftige Größe (also so etwas wie 256x256) und eine RGB-bitmap. Wenn die Datei noch ein kleines problem es WIRD NICHT korrekt dargestellt wird, egal wie du es versuchst.
Dann, ich würd halt versuchen, nur die debug-code und stattdessen sehen, was Sie anders auf die tutorial auf der NeHe website.
NeHe ist immer ein guter Ort, um zu überprüfen, wenn Sie versuchen, um Dinge zu tun, die in OpenGL. Texturen sind wohl die härteste Sache richtig zu machen, und Sie bekommen nur mehr schwierig, wie der rest Ihrer GL-Fähigkeiten zu erhöhen.