Problem mit Texturen in OpenGL
-
Ich bin noch Anfänger was OpenGL angeht, daher verstehe ich nicht, warum bei folgendem code nur ein grünes Viereck auf weißem Hintergrund erscheint statt einer bitmap.
glMatrixMode( GL_PROJECTION ); glLoadIdentity(); glOrtho(0, 100, 0, 100 , -1.0, 1.0); glClearColor( 1.0 , 1.0 , 1.0 , 0.0 ); glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glColor3f( 0.0, 1.0, 0.0 ); glEnable( GL_TEXTURE_2D ); GLuint texture; glGenTextures( 1 , &texture ); glBindTexture( GL_TEXTURE_2D , texture ); glTexImage2D ( GL_TEXTURE_2D , 0 , GL_RGBA , 64 , 64 , 0 , GL_RGBA , GL_UNSIGNED_BYTE , bitmap.data() ); glTranslatef( 18 , 18 , 0 ); glBegin( GL_QUADS ); glTexCoord2d( 0 , 0 ); glVertex2d( 0 , 0 ); glTexCoord2d( 1 , 0 ); glVertex2d( 64 , 0 ); glTexCoord2d( 1 , 1 ); glVertex2d( 64 , 64 ); glTexCoord2d( 0 , 1 ); glVertex2d( 0 , 64 ); glEnd(); glFlush();
Ich hab schon versucht, glGetError abzufragen, gibt GL_NO_ERROR zurück.
Bitmap.data() sieht so aus (in bytes):
0
0
0
255
0
0
0
255
...Noch eine andere Frage, die damit nichts zu tun hat: Wann wird denn OpenGL zurück gesetzt, d.h. alle Zustandsvariablen auf default gesetzt? Immer wenn ich den context zerstöre, oder auch wenn ich den video buffer austausche (windows)?
-
Hast du evtl. vergessen, die Texturfilter zu setzen (glTexParameteri())?
Kleiner Hinweis: Verwend für das internalFormat bei glTexImage2D() besser ein exaktes Format, also z.B. GL_RGBA8 und nicht einfach nur GL_RGBA.
Bei SwapBuffers() wird der State nicht zurückgesetzt.
-
Danke, das wars.
-
Ob er GL_RGBA8 oder GL_RGBA8 verwendet ist egal. Die Grafikkarte wird sehr wahrscheinlich sowieso BGRA8 verwenden.
Wenn du es nicht mit dots Tipp hinbekommst, zeig uns mal wie du die Textur lädst und welche Parameter du für diese setzt.
-
Ok ich hab grade bemerkt, dass ich nicht RGBA sondern BGRA einlese (ist das normal bei tga files?). Kann ich das OpenGL in dem Format übergeben oder muss ich rot und blau immer vertauschen? Ich hab mal etwas gegoogelt und bin auf GL_BGRA gestoßen, das ist bei mir aber nicht definiert.
-
GorbGorb schrieb:
(ist das normal bei tga files?).
Ja.
GorbGorb schrieb:
Kann ich das OpenGL in dem Format übergeben oder muss ich rot und blau immer vertauschen?
Du kannst bei glTexImage2D doch sowohl input als auch "output" (bzw. internes Format) angeben. Wo ist da jetzt das Problem?
-
GorbGorb schrieb:
Ok ich hab grade bemerkt, dass ich nicht RGBA sondern BGRA einlese (ist das normal bei tga files?). Kann ich das OpenGL in dem Format übergeben oder muss ich rot und blau immer vertauschen? Ich hab mal etwas gegoogelt und bin auf GL_BGRA gestoßen, das ist bei mir aber nicht definiert.
wenn ich mich recht erinnere ist das nicht standard (gewesen), deswegen gab es GL_BGRA_EXT oder so, definiert in glext.h, kannst du dir ergooglen
-
Es ist schon seit längerer Zeit quasi Standard das Grafikkarten intern BGRA verwenden. Jedenfalls bei NVIDIA und ATI/AMD. (solange es nicht um Fließkomma Werte geht).
Daher sind Grafikdaten im BGRA Format die performanteste Art um daraus OpenGL Texturen zu erstellen.Also alles ob RGBA oder auch RGB wird von OpenGL konvertiert und im Grafikspeicher meist als BGRA abgelegt.
Das ist aber normalerweise kein Flaschenhals, daher lohnt es sich nicht alle Grafiken nun auf Gedeihe und Gebrechen als TGA abzuspeichern.
-
ich sprach von der api.
es gibt keinen hardware standard...
-
Doch, sowohl ATI (http://developer.amd.com/media/gpu_assets/ATI_OpenGL_Programming_and_Optimization_Guide.pdf) wie auch Nvidia (http://developer.download.nvidia.com/assets/gamedev/docs/Fast_Texture_Transfers.pdf?display=style-table) geben BGRA als optimales Format zum Textur Upload und besonders Download (Also GPU memory->CPU memory) an.
Ich habe mir dass nicht alles ausgedacht!
Wie das bei Intel und dem Rest ist, weiß ich allerdings nicht.
Ist aber wie gesagt nur selten relevant, da der Texturupload meist keinen Flaschenhalls darstellt.
-
Osbios schrieb:
Doch, sowohl ATI (http://developer.amd.com/media/gpu_assets/ATI_OpenGL_Programming_and_Optimization_Guide.pdf) wie auch Nvidia (http://developer.download.nvidia.com/assets/gamedev/docs/Fast_Texture_Transfers.pdf?display=style-table) geben BGRA als optimales Format zum Textur Upload und besonders Download (Also GPU memory->CPU memory) an.
das ist eine empfehlung, kein standard. intern kann die hardware auch andere formate nutzen, entsprechend ist es kein hw standard.
Ich habe mir dass nicht alles ausgedacht!
lediglich falsch interpretiert
denn wie gesagt, ich bezog mich auf die API und opengl hatte am anfang kein BGRA, deswegen wurde GL_BGRA_EXT eingefuehrt, schau dir einfach den glext.h header an.Wie das bei Intel und dem Rest ist, weiß ich allerdings nicht.
Ist aber wie gesagt nur selten relevant, da der Texturupload meist keinen Flaschenhalls darstellt.wenn du ein stottern in spielen siehst, kann das am textur upload liegen. passiert oft am anfang von leveln (z.B. Asphalt 6) und bei spielen die streamen wenn man in einen neuen bereich kommt (z.b. Halo 3).