[OPEN GL] glVertexAttribPointer für VVVVCCCC VBO
EDIT2: Da sich das Problem gelöst hat, kann der Thread geschlossen werden. Leider ist mir schleierhaft, wie ich das selbst mache
EDIT: Falls es noch jemand lesen sollte, danke dafür, aber das Problem hat sich gelöst. Ich habe einen ganz banalen Fehler begangen. Da erst später die Farbinformationen in das vertexData-Array angehängt werden, habe ich fälschlicherweise
aufgerufen. Dadurch habe ich aber nur die Informationen für die einzelnen Vertices geladen und den Rest, die Farbinformationen, abgeschnitten. Korrektur zu
hat Abhilfe geschafft. Jetzt stehen auch die Farbinformationen zur Verfügung.
Tag zusammen,
ich bedanke mich gleich im Voraus für jede Hilfe. Ich bin ein Anfänger mit OpenGL und dies ist eine Hausaufgabe, ich möchte keine Lösung, ich möchte nur gern verstehen, wo ich welchen Fehler begehe.
Es geht explizit um glVertexAttribPointer, dessen Anwendung ich nicht 100%ig verstehe. Erstmal kurz zur Sachlage:
Ich habe einen .obj-Datei, die erfolgreich eingelesen und gespeichert wird. Bis zum Erstellen der VBO funktioniert alles wie gewünscht. Die Daten liegen zu dem Zeitpunkt in einem Array im folgenden Format vor.
Vertex und Color Einträge bestehen immer aus 3 GLfloats.
Nun werden VAO, VBO, IBO erzeugt und geladen
Nun kommts zum entscheidenen Punkt, wo ich ratlos bin. Es geht nun darum, dass ich glVertexAttribPointer für die Farben umsetzen will. Ich habe mich bzgl. stride und offset informiert. Für das Format v[SUB]1[/SUB] | c[SUB]1[/SUB] | v[SUB]2[/SUB] | c[SUB]2[/SUB] | .... würde das für die Farben bedeuten:
stride = 6*sizeof(GLfloat) = 24
offset = 3*sizeof(GLfloat) = 12
Und damit glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, 12). Entsprechend habe ich es versucht auf mein obiges Format anzuwenden: Distanz zwischen v[SUB]1[/SUB] und v[SUB]2[/SUB] entspricht 3*sizeof(GLfloat). Distanz von v[SUB]1[/SUB] zu c[SUB]1[/SUB] ist 3*n*sizeof(GLfloat). Damit würde der Befehlsaufruf wie folgt lauten: glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), 3*vertexCount*sizeof(GLfloat)).
Zu meinem Bedauern funktioniert das überhaupt nicht, nur wenige Flächen besitzen tatsächlich eine Farbe am Ende. Ich habe mit dem stride und offset Wert rumgespielt, ohne Erfolg.
Also habe ich mich dazu entschlossen ein eigenes VBO für die Farbdaten zu erstellen. Alle RGB Werte wurden also in ein Array colorData gespeichert.
Diese Umsetzung funktioniert einwandfrei. Das Objekt ist perfekt zu erkennen und alles entsprechend eingefärbt. Leider entspricht dies nicht der Vorgabe, da zwei VBOs erstellt wurden. Dies soll aber alles mit einem geschehen. Ich habe schon viele Internetseiten durchforstet und habe keine Hilfe gefunden, da bei allen der Weg über mehrere VBOs gewählt wurde. Und falls es mal nicht der Fall war, war für mich nicht ersichtlich, warum es dort funktionieren sollte, und bei mir scheitert.
Falls mir jemand einen Tipp geben kann, wo ich einen Denkfehler habe oder es an der Umsetzung hapert, ich wäre sehr dankbar.
Grüße
EDIT2: Da sich das Problem gelöst hat, kann der Thread geschlossen werden. Leider ist mir schleierhaft, wie ich das selbst mache

EDIT: Falls es noch jemand lesen sollte, danke dafür, aber das Problem hat sich gelöst. Ich habe einen ganz banalen Fehler begangen. Da erst später die Farbinformationen in das vertexData-Array angehängt werden, habe ich fälschlicherweise
Code:
glBufferData(GL_ARRAY_BUFFER, [B]sizeof(GL_FLOAT)*vertexCount*3[/B], vertexData, GL_STATIC_DRAW);
Code:
glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT)*vertexCount*3[B]*2[/B], vertexData, GL_STATIC_DRAW);
Tag zusammen,
ich bedanke mich gleich im Voraus für jede Hilfe. Ich bin ein Anfänger mit OpenGL und dies ist eine Hausaufgabe, ich möchte keine Lösung, ich möchte nur gern verstehen, wo ich welchen Fehler begehe.
Es geht explizit um glVertexAttribPointer, dessen Anwendung ich nicht 100%ig verstehe. Erstmal kurz zur Sachlage:
Ich habe einen .obj-Datei, die erfolgreich eingelesen und gespeichert wird. Bis zum Erstellen der VBO funktioniert alles wie gewünscht. Die Daten liegen zu dem Zeitpunkt in einem Array im folgenden Format vor.
Code:
v[SUB]1 [/SUB]| v[SUB]2[/SUB] | ... | v[SUB]n[/SUB] | c[SUB]1[/SUB] | ... | c[SUB]n[/SUB]
Vertex und Color Einträge bestehen immer aus 3 GLfloats.
Nun werden VAO, VBO, IBO erzeugt und geladen
Code:
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT)*vertexCount*3, vertexData, GL_STATIC_DRAW);
glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(0);
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, faceCount*3*sizeof(GLint), faceData, GL_STATIC_DRAW);
Nun kommts zum entscheidenen Punkt, wo ich ratlos bin. Es geht nun darum, dass ich glVertexAttribPointer für die Farben umsetzen will. Ich habe mich bzgl. stride und offset informiert. Für das Format v[SUB]1[/SUB] | c[SUB]1[/SUB] | v[SUB]2[/SUB] | c[SUB]2[/SUB] | .... würde das für die Farben bedeuten:
stride = 6*sizeof(GLfloat) = 24
offset = 3*sizeof(GLfloat) = 12
Und damit glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 24, 12). Entsprechend habe ich es versucht auf mein obiges Format anzuwenden: Distanz zwischen v[SUB]1[/SUB] und v[SUB]2[/SUB] entspricht 3*sizeof(GLfloat). Distanz von v[SUB]1[/SUB] zu c[SUB]1[/SUB] ist 3*n*sizeof(GLfloat). Damit würde der Befehlsaufruf wie folgt lauten: glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), 3*vertexCount*sizeof(GLfloat)).
Zu meinem Bedauern funktioniert das überhaupt nicht, nur wenige Flächen besitzen tatsächlich eine Farbe am Ende. Ich habe mit dem stride und offset Wert rumgespielt, ohne Erfolg.
Also habe ich mich dazu entschlossen ein eigenes VBO für die Farbdaten zu erstellen. Alle RGB Werte wurden also in ein Array colorData gespeichert.
Code:
GLuint cbo;
glGenBuffers(1, &cbo);
glBindBuffer(GL_ARRAY_BUFFER, cbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(GL_FLOAT)*colors.size()*3, colorData, GL_STATIC_DRAW);
glVertexAttribPointer(1,3,GL_FLOAT,GL_FALSE,0,0);
glEnableVertexAttribArray(1);
Diese Umsetzung funktioniert einwandfrei. Das Objekt ist perfekt zu erkennen und alles entsprechend eingefärbt. Leider entspricht dies nicht der Vorgabe, da zwei VBOs erstellt wurden. Dies soll aber alles mit einem geschehen. Ich habe schon viele Internetseiten durchforstet und habe keine Hilfe gefunden, da bei allen der Weg über mehrere VBOs gewählt wurde. Und falls es mal nicht der Fall war, war für mich nicht ersichtlich, warum es dort funktionieren sollte, und bei mir scheitert.
Falls mir jemand einen Tipp geben kann, wo ich einen Denkfehler habe oder es an der Umsetzung hapert, ich wäre sehr dankbar.
Grüße
Zuletzt bearbeitet: