Hello.
I am new to opengl and trying to code some fractal scenes (like a sierpinski triangle http://en.wikipedia.org/wiki/Sierpinski_triangle). That was fortunatly a success but I only managed to do this with the creation of each triangle for itself and redering it. As this costs very much performance I wanted to do this via vertex buffer arrays. Sadly it seems that I have a logic problem in my code and I hope you could help me to find it.
I have a structure for colored vertices:
struct ColoredVertex
{
M3DVector3f m_Position;
M3DVector3f m_Color;
};
In a recursive call I want to fill now the vertices into this structure (and colorize it that later a 3D tetraeder is created with colored sides)
ColoredVertex frontTriangle[3];
// draw front triangle
m3dLoadVector3(frontTriangle[0].m_Position, xB, yB, zB);
m3dLoadVector3(frontTriangle[1].m_Position, xA, yA, zA);
m3dLoadVector3(frontTriangle[2].m_Position, xD, yD, zD);
m3dLoadVector3(frontTriangle[0].m_Color, 0.0f, 1.0f, 0.0f); // green
m3dLoadVector3(frontTriangle[1].m_Color, 0.0f, 1.0f, 0.0f); // green
m3dLoadVector3(frontTriangle[2].m_Color, 0.0f, 1.0f, 0.0f); // green
Then I create the VBO array:
// Erzeuge das VBO
glGenBuffers(m_Depth, &m_FrontTriangle);
glBindBuffer(GL_ARRAY_BUFFER, m_FrontTriangle);
//Kopiere die 3 * m_Depth + 1 vertices ins VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(ColoredVertex) * (3 * m_Depth), frontTriangle, GL_STATIC_DRAW);
glGenVertexArrays(m_Depth,&m_vaoFrontTriangle);
glBindVertexArray(m_vaoFrontTriangle);
// erstes Shader-Attribut aktivieren (Vertex-Position)
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(ColoredVertex), NULL);
// Zweites Shader-Attribut aktivieren (Farbe).
//Farbdaten stehen immer nach der Position, daher ein offset der Größe von M3DVector3f notwendig
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(ColoredVertex), (const GLvoid *)(sizeof(M3DVector3f)));
//VAO wieder unbinden
glBindVertexArray(0);
In my render loop I try to draw these triangles:
//VBO aktivieren
glBindVertexArray(m_vaoFrontTriangle);
glBindBuffer(GL_ARRAY_BUFFER, m_FrontTriangle);
// Zeiche einen Triangle
glDrawArrays(GL_TRIANGLES, 0,3 * m_Depth));
//Aufräumen
glBindVertexArray(0);
Well… it only draws a single triangle all the time regardless how I resize the vertex array. It seems like I dont write all necessary vertices into the vertex buffer, but I couldn’t figure out how it should be done right.
Does anyone have a hint or sees what I’m doing wrong?
All help is welcome