2016-05-12 9 views
1

Ich möchte wissen, ob es möglich ist, OpenGL 3.1 + Kern-Profil mit Vertex-Arrays (Client-Seite Rendering nicht Sofort-Modus) ohne Verwendung der VBO zu zeichnen. Ich weiß in opengl 3.1+ Kernprofil Verwendung von VAO ist von wesentlicher Bedeutung. Ich möchte wissen, ob es möglich ist, ohne VBO zu zeichnen, indem Vertexarrays (clientseitige Vertexarray nicht Sofortmodus) verwendet.Rendering in opengl 3.1 + ohne VBO mit clientseitige Vertex Array

PS Ich spreche über Client-Vertex-Array nicht Sofort-Modus. Ich möchte wissen, ob ich einen VAO ohne VBO erstellen kann

Ich habe dies irgendwo in opengl spec Immediate-Modus Vertex-Attribut-Spezifikation gelesen, clientseitige Vertex-Arrays ist entzogen. Vertex-Attribute müssen in einem oder mehreren Buffer-Objekten gespeichert oder explizit mit glVertexAttrib *() angegeben werden. Seit OpenGL 3.2 Vertex Array-Objekte verwenden ist obligatorisch. So bedeutet dies bedeutet, dass ich Vertex-Array-Daten unter Verwendung der glVertexAttriPointer wie diese

glBindVertexArray(m_vaoHandle); 

glEnableVertexAttribArray(m_attributes[POSITION_HANDLE]); 
glVertexAttribPointer(m_attributes[POSITION_HANDLE], 3, GL_FLOAT, false, 0,vertexArray); 

glEnableVertexAttribArray(m_attributes[TEXCOORDINATE_HANDLE]); 
glVertexAttribPointer(m_attributes[TEXCOORDINATE_HANDLE], 2, GL_FLOAT, false, 0, textureArray); 

glBindVertexArray(0); 

Hier vertexArray und textureArray sind zwei Arrays auf CPU nicht VBO angeben. Dann, während sie

glUseProgram(m_Program); 

// Explicitly unbind buffer so attrib pointer knows to slurp in array. 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

//bind vertex array object 
glBindVertexArray(m_vaoHandle); 

glDrawArrays(mode, 0, numVertices); 

glBindVertexArray(0); 

Wenn seine mögliche in OpenGL 3.1 + zeichnen, würde ich auch wenn ihr möglich in OpenGLES 3.0

+1

Nein. Lesen Sie [die Dokumente] (https://www.opengl.org/sdk/docs/man/html/glVertexAttribPointer.xhtml). Insbesondere über den letzten Parameter. – Drop

+1

Es bedeutet genau was du aus der Spezifikation zitierst. Keine clientseitigen Vertex-Arrays. 'glVertexAttrib *()' bezieht sich auf Aufrufe wie 'glVertexAttrib4fv()', mit denen Sie "konstante" Werte für Vertexattribute angeben können, d. h. Attribute, bei denen alle Vertices den gleichen Wert haben. –

Antwort

1

Das Kernprofil von OpenGL 3.2 + entfernt, um die Fähigkeit zur Nutzung clientseitige gerne wissen, Vertex-Arrays.

OpenGL ES 2.0 erlaubt die Verwendung von clientseitigen Vertex-Arrays, wie alle höheren Versionen von ES. Die Vertex-Shader-Eingabevariable gl_VertexID (in GLSL ES 3.00 hinzugefügt) ist undefined bei Verwendung von clientseitigen Arrays. Ach ja, und clientseitige Vertex-Arrays in ES 3.0 sind in Anhang F.1: Legacy-Features erwähnt. Über sie sagt es:

Die folgenden Features sind vorhanden, um Abwärtskompatibilität mit OpenGL ES 2.0 zu erhalten, aber ihre Verwendung in nicht empfohlen, da es wahrscheinlich ist, dass diese Features in einer zukünftigen Version entfernt werden.

Während ich sie jemals nicht erwarten würde weggehen, klar werden Sie empfohlen, nicht sie zu nutzen.

Zur Frage, ob VAOs überhaupt mit clientseitigen Zeigern arbeiten können, ja (wenn clientseitige Zeiger überhaupt unterstützt werden). VAOs speichern immer den Vertex-Array-Status, unabhängig davon, woher diese Arrays stammen. Der Aufruf von glVertexAttribPointer mit einem clientseitigen Zeiger speichert den Zeiger innerhalb des aktuellen VAO, genau so, wie er das Pufferobjekt + Offset innerhalb des VAO speichern würde.