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

Popular posts from this blog

Why can rails not find a route created by a helper? -

javascript - jquery or ashx not working -

opencv - DataType<cv::detail::deriv_type>::depth what is it used for -