OpenGL 3.x: Access violation when using vertex buffer object and glDrawElements(...) -
i have trouble rendering geometry using vertex buffer object. intend draw plane of points, 1 vertex @ every discrete position in space. however, cannot render plane, every time call gldrawelements(...), application crashes returning access violation exception. there must mistake while initialization, guess.
this have far:
#define space_x 512 #define space_z 512 typedef struct{ glfloat x, y, z; // position glfloat nx, ny, nz; // normals glfloat r, g, b, a; // colors } vertex; typedef struct{ gluint i; // index } index; // create vertex buffer gluint vertexbufferobject; glgenbuffers(1, &vertexbufferobject); // create index buffer gluint indexbufferobject; glgenbuffers(1, &indexbufferobject); // determine number of vertices / primitives const int numberofvertices = space_x * space_z; const int numberofprimitives = numberofvertices; // i'm going render gl_points, number of primitives same number of vertices // create vertex array vertex* vertexarray = new vertex[numberofvertices]; // create index array index* indexarray = new index[numberofprimitives]; // create planes (vertex array) // color of vertices red int index = -1; for(glfloat x = -space_x / 2; x < space_x / 2; x++) { for(glfloat z = -space_z / 2; z < space_z / 2; z++) { index++; vertexarray[index].x = x; vertexarray[index].y = 0.0f; vertexarray[index].z = z; vertexarray[index].nx = 0.0f; vertexarray[index].ny = 0.0f; vertexarray[index].nz = 1.0f; vertexarray[index].r = 1.0; vertexarray[index].g = 0.0; vertexarray[index].b = 0.0; vertexarray[index].a = 1.0; } } // bind vertex buffer glbindbuffer(gl_array_buffer, vertexbufferobject); // buffer vertex array glbufferdata(gl_array_buffer, numberofvertices * sizeof(vertex), vertexarray, gl_dtream_draw); // bind vertex buffer again glbindbuffer(gl_array_buffer, vertexbufferobject); // enable attrib index 0 (positions) glenablevertexattribarray(0); // pass positions in glvertexattribpointer((gluint)0, 3, gl_float, gl_false, sizeof(vertex), vertexarray); // enable attribute index 1 (normals) glenablevertexattribarray(1); // pass normals in glvertexattribpointer((gluint)1, 3, gl_float, gl_false, sizeof(vertex), &vertexarray[0].nx); // enable attribute index 2 (colors) glenablevertexattribarray(2); // pass colors in glvertexattribpointer((gluint)2, 4, gl_float, gl_false, sizeof(vertex), &vertexarray[0].r); // create index array for(glunit = 0; < numberofprimitives; i++) { indexarray[i].i = i; } // bind buffer glbindbuffer(gl_elemenet_array_buffer, indexbufferobject); // buffer indices glbufferdata(gl_elemenet_array_buffer, numberofprimitives * sizeof(index), indexarray, gl_stream_draw); // bind buffer again glbindbuffer(gl_elemenet_array_buffer, indexbufferobject); // , here crashes! // draw plane of gl_points gldrawelements(gl_points, numberofprimitives, gl_unsigned_int, indexarray); // bind default buffers glbindbuffer(gl_array_buffer, 0); glbindbuffer(gl_element_array_buffer, 0); // delete vertex / index buffers gldeletebuffers(1, &vertexbufferobject); gldeletebuffers(1, &indexbufferobject); delete[] vertexarray; vertexarray = null; delete[] indexarray; indexarray = null;
when using buffer objects, last parameters in gl*pointer , 4th parameter in gldrawelements no longer addresses in main memory (yours still are!), offsets buffer objects. make sure compute these offsets in bytes! "offsetof" macro helpful there.
Comments
Post a Comment