Draw 2D-Image Opengl 3+
-
Heyho,
Ich möchte gerne ein 2D Bild in einen glViewport "malen".
Die einzige Möglichkeit die mir dazu einfällt, ist ein Rechteck mit der Größe des Bildes zu malen und das Bild als Textur drauf zu ziehen.
Bei meiner Google-Suche nach eleganteren Lösungen bin ich leider nicht fündig geworden.
Gibt es elegantere Lösungen oder muss ich mich mit dem Workaround zufrieden geben?
Gruß
-
JangoK schrieb:
Die einzige Möglichkeit die mir dazu einfällt, ist ein Rechteck mit der Größe des Bildes zu malen und das Bild als Textur drauf zu ziehen.
Genau so macht man es auch...
-
Okay danke
habe jetzt ein eindimensionales Array mit Pixeldaten 1024*1024
Bin noch anfänger mit OpenGL und hab jetzt kA wie ich das auf meinen Bildschirm kriegeAlso in Theorie soweit klar, aber dadurch wie ich daraus code mache blick ich noch nicht durch, hab das mit den Vertices usw wohl noch nich ganz gerafft.
Gruß
Jango
-
Na wie du schon gesagt hast: Dein Bild in eine Textur packen und dann ein Quad mit der Textur drauf rendern...
-
Muss ich mir da nicht auch noch diese UV-Vectoren erstellen?
-
Du meinst Texturkoordinaten!? Ja, die wirst du brauchen, um die Textur auf dein Quad zu bekommen...
-
Muss ich mir da nicht auch noch diese UV-Vectoren erstellen?
Ja aber die sind ja simpel. Einfach (0,0) (0,1) (1,0) (1,1). Das kannst du zur Not auch durchprobieren.
-
Ok, müssten das nicht eigentlich auch 3 UVs pro Dreieck sein?
Demnach also 6?
-
Ja schon...
Aber letztlich zeichnest du ein Viereck. Nur dass du 2 Punkte doppelt zeichnen musst wenn du das Viereck als Triangles zeichnest.
-
Also ist es bei den UVs, anders als bei den Vertices, möglich die tatsächlichen Eckpunkte an zu geben und die nicht in Dreiecke zerlegen zu müssen.
Okay danke
Noch ne Frage zu den UVs.
Die UVs sind doch immer in den relativen Koordinaten zwischen -1 und 1 an zu geben oder?
Mein Rechteck gebe ich nämlich in tatsächlichen "pixeldaten" an und (Pixel breite und höhe eben)
-
Also ist es bei den UVs, anders als bei den Vertices, möglich die tatsächlichen Eckpunkte an zu geben und die nicht in Dreiecke zerlegen zu müssen.
Äh was ? Du hast da was falsch verstanden. Du hast ein Viereck bestehend aus 4 Punkten. Da du nur Dreiecke zeichnest brauchst du dafür 6 Vertices. Das bedeutet 2 Vertces sind doppelt. Und jedes der 6 Vertices hat neben den 3 Koordinaten (XYZ) noch 2 Texturkoordinaten (UV).
Die UVs sind doch immer in den relativen Koordinaten zwischen -1 und 1 an zu geben oder?
Nein ? Immer zwischen 0 und 1. 0 Die eine Seite (unten/links) und 1 die andere (oben/rechts).
Mein Rechteck gebe ich nämlich in tatsächlichen "pixeldaten" an und (Pixel breite und höhe eben)
Geht aber auch nur im entsprechenden Ortografischen View. Normal sind auch die Koordinaten nicht in Pixeln angegeben.
-
Hallo das kannst Du so erreichen.
Pseudocode:
gluBuild2DMipmaps(GL_TEXTURE_2D,(m_bpp>>3), m_width, m_height,mode,GL_UNSIGNED_BYTE,pMapMem); void CTerrain::Render(CGLfont *pFnt) { if(!m_pVert) return; if(!m_dib.GetBmih() || !m_nVBONormals || !m_nVBOVertices || !m_nVBOIdx || !m_pLastMap) return; if(m_TexOn) { glEnable(GL_TEXTURE_2D), glBindTexture(GL_TEXTURE_2D, m_texid), glEnableClientState(GL_TEXTURE_COORD_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOTexCoords); glTexCoordPointer(2, GL_FLOAT, 0, 0); } glEnableClientState(GL_NORMAL_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBONormals); glNormalPointer(GL_FLOAT, 0, 0); glEnableClientState(GL_VERTEX_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOVertices); glVertexPointer(3, GL_FLOAT, 0, 0); if(!m_TexOn) { glEnableClientState(GL_COLOR_ARRAY); glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_nVBOColors); glColorPointer(3, GL_FLOAT, 0, 0); } glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_nVBOIdx); glScalef(1,1,m_UsrScale); glDrawElements(GL_TRIANGLES, m_idsz, GL_UNSIGNED_INT, 0); glScalef(1,1,1); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_NORMAL_ARRAY); glDisableClientState(GL_COLOR_ARRAY); if(m_TexOn) glDisableClientState(GL_TEXTURE_COORD_ARRAY),glDisable(GL_TEXTURE_2D); }
Allerdings gibt es hier verschiedene umfangreiche Optionen, bei Fragen melden.
Beispiel:
http://youtu.be/pDi9gXCzTps