c++ - OpenGL access violation at glDrawArrays(...) -
i'm following tutorial set vbos modern opengl. managed mesh , shader running (shader set make each pixel red).
next tutorial set shader use texture mapping, seems load correctly in debugger, i'm not sure since error once gldrawarrays(...);
i think stuff kind of hard into, i'm guessing i'm doing horribly wrong somewhere. sorry in advance might see x)
error output:
first-chance exception @ 0x52e4a415 (nvoglv32.dll) in modern opengl.exe: 0xc0000005: access violation reading location 0x00000000. this mesh code (or vbo code):
mesh::mesh() { //generate vertex array glgenvertexarrays(1, &arrayobject); (int = 0; < vbo_count; i++) { //generate vertex buffer glgenbuffers(1, &buffers[i]); } } mesh::mesh(objectdata *obj) { //initialize first mesh::mesh(); //set object parameter setobject(obj); } mesh::~mesh() { (int = 0; < vbo_count; i++) { //delete buffer gldeletebuffers(1, &buffers[i]); } //delete array gldeletevertexarrays(1, &arrayobject); } void mesh::draw() { //tell opengl array use glbindvertexarray(arrayobject); gldrawarrays(gl_triangles, 0, object->vertices.size()); glbindvertexarray(null); } void mesh::updatevbo() { //tell opengl vertex array use glbindvertexarray(arrayobject); //set buffer data glbindbuffer(gl_array_buffer, buffers[vbo_vertex]); glbufferdata(gl_array_buffer, sizeof(object->vertices[0]) * object->vertices.size(), &object->vertices.front(), gl_static_draw); //set shader attribute data glenablevertexattribarray(vbo_vertex); glvertexattribpointer(0, 3, gl_float, gl_false, 0, 0); //set buffer data glbindbuffer(gl_array_buffer, buffers[vbo_texcord]); glbufferdata(gl_array_buffer, sizeof(object->texcoords[0]) * object->texcoords.size(), &object->texcoords.front(), gl_static_draw); //set shader attribute data glenablevertexattribarray(vbo_texcord); glvertexattribpointer(0, 2, gl_float, gl_false, 0, 0); //unbind vertex array glbindvertexarray(null); } void mesh::setobject(objectdata *obj) { object = obj; updatevbo(); } here shader code:
shader::shader(string filename) { m_program = glcreateprogram(); m_shaders[sha_vertex] = createshader(loadshader(filename + ".vs"), gl_vertex_shader); m_shaders[sha_fragment] = createshader(loadshader(filename + ".fs"), gl_fragment_shader); (int = 0; < sha_count; i++) { glattachshader(m_program, m_shaders[i]); } glbindattriblocation(m_program, vbo_vertex, "vertices"); glbindattriblocation(m_program, vbo_texcord, "texcoords"); gllinkprogram(m_program); checkshadererror(m_program, gl_link_status, true, "error linking shader program"); glvalidateprogram(m_program); checkshadererror(m_program, gl_validate_status, true, "invalid shader program"); } shader::~shader() { (int = 0; < sha_count; i++) { gldetachshader(m_program, m_shaders[i]); gldeleteshader(m_shaders[i]); } gldeleteprogram(m_program); } string shader::loadshader(string filepath) { ifstream file; file.open((filepath).c_str()); string output; string line; if(file.is_open()) { while(file.good()) { getline(file, line); output.append(line + "\n"); } } else { printf("unable load shader: %s\n", filepath.c_str()); } return output; } void shader::checkshadererror(gluint shader, gluint flag, bool isprogram, string errormessage) { glint success = 0; glchar error[1024] = {0}; if (isprogram) { glgetprogramiv(shader, flag, &success); } else { glgetshaderiv(shader, flag, &success); } if (success == gl_false) { if(isprogram) { glgetprograminfolog(shader, sizeof(error), null, error); } else { glgetshaderinfolog(shader, sizeof(error), null, error); } printf("%s: '%s'\n", errormessage.c_str(), error); } } gluint shader::createshader(string text, unsigned int type) { gluint shader = glcreateshader(type); if (shader == 0) { printf("error compiling shader type %i\n", type); } const glchar *p[1]; p[0] = text.c_str(); glint lengths[1]; lengths[0] = text.length(); glshadersource(shader, 1, p, lengths); glcompileshader(shader); checkshadererror(shader, gl_compile_status, false, "error compiling shader!"); return shader; } void shader::bind() { gluseprogram(m_program); } edit: here vertices , texcoords:
//create test objects objectdata *obj = new objectdata(); obj->vertices.push_back(glm::vec3(-1, 0, 0)); obj->vertices.push_back(glm::vec3(0, 0.5, 0)); obj->vertices.push_back(glm::vec3(0, -0.5, 0)); obj->texcoords.push_back(glm::vec2(0.0, 0.5)); obj->texcoords.push_back(glm::vec2(0.5, 0.75)); obj->texcoords.push_back(glm::vec2(0.5, 0.25)); obj->vertices.push_back(glm::vec3(1, 0, 0)); obj->vertices.push_back(glm::vec3(0, 0.5, 0)); obj->vertices.push_back(glm::vec3(0, -0.5, 0)); obj->texcoords.push_back(glm::vec2(1.0, 0.5)); obj->texcoords.push_back(glm::vec2(0.5, 0.75)); obj->texcoords.push_back(glm::vec2(0.5, 0.25)); here object data:
struct objectdata { vector <glm::vec3> vertices, normals, colors; vector <glm::vec2> texcoords; vector <glint> indices; objectdata(); };
you using location position , texture coordinate attributes. think in code:
//set shader attribute data glenablevertexattribarray(vbo_texcord); glvertexattribpointer(0, 2, gl_float, gl_false, 0, 0); you meant pass vbo_texcord first argument glvertexattribpointer.
Comments
Post a Comment