2016-10-22 6 views
0

Ich hatte gehofft, Hilfe zu einer OpenGL-Frage bezüglich der Erstellung und Darstellung von VAOs zu bekommen. Das Ziel ist einfach, dies zu nehmen:VAO keine Farben OpenGL?

glBegin(GL_TRIANGLES); 
glColor4f(1.0f, 0.0f, 0.0f, 1.0f); 
glVertex3f(-0.5f, 0.5f, 0.0f); 
glVertex3f(-0.5f, -0.5f, 0.0f); 
glVertex3f(0.5f, -0.5f, 0.0f); 
glVertex3f(-0.5f, 0.5f, 0.0f); 
glVertex3f(0.5f, -0.5f, 0.0f); 
glVertex3f(0.5f, 0.5f, 0.0f); 
glEnd(); 

, die in der Mitte des Fensters ein rotes Quadrat macht, und schalten Sie ihn in eine VAO mit Ecken, Farben und Indizes. Nun ist es das, was ich bisher so weit wie das VAO zu schaffen (sorry, wenn dies ein bisschen zu lang für den Code ist):

//initialize all data 
verts_amt = 6; 

Vertex* verts = (Vertex*)malloc(sizeof(Vertex) * verts_amt); 
int* indices = (int*)malloc(sizeof(int) * verts_amt); 

verts[0] = createVertex(-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); 
verts[1] = createVertex(-0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); 
verts[2] = createVertex(0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); 
verts[3] = createVertex(-0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); 
verts[4] = createVertex(0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); 
verts[5] = createVertex(0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f); 

int i; 
for(i = 0; i < 6; i ++) 
    indices[i] = i; 

unsigned int vbo, ibo; 
//create, bind, set data, and then unbind for the vbo and ibo 
glGenBuffers(1, &vbo); 
glBindBuffer(GL_ARRAY_BUFFER, vbo); 
glBufferData(GL_ARRAY_BUFFER, verts_amt * sizeof(Vertex), verts, GL_STATIC_DRAW); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glGenBuffers(1, &ibo); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBufferData(GL_ELEMENT_ARRAY_BUFFER, verts_amt * sizeof(int), indices, GL_STATIC_DRAW); 
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); 

//create vao, bind vao, bind and set data for vbo, bind ibo, then unbind vao 
glGenVertexArrays(1, &vao); 
glBindVertexArray(vao); 

glBindBuffer(GL_ARRAY_BUFFER, vbo); 

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), NULL); 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, r)); 
glEnableVertexAttribArray(1); 

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo); 
glBindVertexArray(0); 

, falls Sie sich fragen,, Vertex ist nur eine Struktur aus sieben schwimmt in der Reihenfolge x, y, z, r, g, b, a. Nach einem Blick durch ähnliche Fragen zu diesem Thema, ich bin immer noch nicht zu sehen, was mir fehlt und/oder nicht richtig machen, denn wenn ich es mit diesen einfachen Linien machen:

glBindVertexArray(vao); 
glDrawElements(GL_TRIANGLES, verts_amt, GL_UNSIGNED_INT, NULL); 

es nur eine competey weiß macht Platz. Denken Sie daran, ich ändere nichts anderes über meine Rendering-Schleife, außer natürlich die Vertex3f, glBegin/glEnd und Color4f Anrufe loszuwerden. Ich sollte auch erwähnen, dass ich kein Shader-Programm verwende, ich bin mir nicht ganz sicher, ob sich das hier drastisch ändert. Jede Hilfe dazu wäre sehr willkommen!

+1

Dinge zu tun, die GL3 + Weg benötigt Shader – Alex

Antwort

1

Ich sollte auch erwähnen, dass ich kein Shader-Programm verwende.

können Sie nicht glVertexAttribPointerohne ein Shader verwenden. Diese Funktionen können nicht mit der OpenGL-Funktionspipeline (FFP) verbunden werden.

Wenn Sie das FFP verwenden und weiterhin Pufferobjekte verwenden möchten, sollten Sie die entsprechenden Funktionen verwenden. glVertexPointer (kein "Attribut") und glColorPointer sind die Array-Äquivalente zu glVertex und glColor. Diese arbeiten mit VAOs gut.

Das einzige, was Sie ändern müssen, sind Ihre zwei glVertexAttribPointer Anrufe zu glVertexPointer und glColorPointer (und natürlich die Parameter entsprechend anpassen).

+0

hat sehr gut funktioniert! Es ist auch gut zu wissen, dass der glVertexAttribPointer speziell für Shader verwendet wird, was ich beim Lesen des Themas übersehen habe – YourNameHere