0

I'm having difficulty with setting up a function to take care of generating and binding buffers for me.

I have two functions, as below:

GLuint vertex_buffer(const GLfloat * thing)
{
    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(thing), thing, GL_STATIC_DRAW);
    return vertexbuffer;
}
GLuint cube_vertex_buffer()
{
    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(cube), cube, GL_STATIC_DRAW);
    return vertexbuffer;
}

I have some global data declared for a cube:

static const GLfloat cube[] = {
-1.0f,-1.0f,-1.0f, // triangle 1 : begin
-1.0f,-1.0f, 1.0f,
-1.0f, 1.0f, 1.0f, // triangle 1 : end
 1.0f, 1.0f,-1.0f, // triangle 2 : begin
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f,-1.0f, // triangle 2 : end
 1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
 1.0f,-1.0f,-1.0f,
 1.0f, 1.0f,-1.0f,
 1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
 1.0f,-1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
-1.0f,-1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
 1.0f,-1.0f, 1.0f,
 1.0f, 1.0f, 1.0f,
 1.0f,-1.0f,-1.0f,
 1.0f, 1.0f,-1.0f,
 1.0f,-1.0f,-1.0f,
 1.0f, 1.0f, 1.0f,
 1.0f,-1.0f, 1.0f,
 1.0f, 1.0f, 1.0f,
 1.0f, 1.0f,-1.0f,
-1.0f, 1.0f,-1.0f,
 1.0f, 1.0f, 1.0f,
-1.0f, 1.0f,-1.0f,
-1.0f, 1.0f, 1.0f,
 1.0f, 1.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
 1.0f,-1.0f, 1.0f
};

When I call

GLuint vertexbuffer = cube_vertex_buffer();

Everything works perfectly, but when I try to call

GLuint vertexbuffer = vertex_buffer(cube);

The cube is mangled and looks like randomly placed triangles.

I've tried changing the type of the parameter to the vertex_buffer function, but it doesn't seem to do much good. I don't know if its even possible to pass an array as a pointer as a parameter for this sort of thing. Is there a way to make the vertex_buffer function work?

2 Answers2

1

sizeof(thing) is not equal to sizeof(cube). This might matters

owensss
  • 121
  • 4
0
sizeof(thing) != sizeof(cube)
sizeof(thing) == sizeof(GLfloat*)
sizeof(cube) == sizeof(GLfloat) * 3 * 36

Change the function vertex_buffer like this:

GLuint vertex_buffer(const GLfloat * thing, GLsizeiptr n)
{
    GLuint vertexbuffer;
    glGenBuffers(1, &vertexbuffer);
    glBindBuffer(GL_ARRAY_BUFFER, vertexbuffer);
    glBufferData(GL_ARRAY_BUFFER, n, thing, GL_STATIC_DRAW);
    return vertexbuffer;
}

then call

GLuint vertexbuffer = vertex_buffer(cube, sizeof(cube));