c++ - OpenGL Skybox not displaying correctly or together with another mesh -


i trying implement skybox, blender's favourite monkey neither of them work @ same time. thoughts vbos conflicting each other , not setting them up/binding them correctly. or without skybox, rendered:

without skybox

with skybox

as can see, monkey has disappeared , skybox upside down, , has sepia colour (it should blue, photo of sea be!). below stripped down code, includes vao/vbos, render loop , skybox class - ask if want me include more! i'm new opengl , still trying head around idea of vbos... think maybe i'm not binding vbo in right place, because skybox::skyboxinitbuffers() method causes monkey not drawn. using bitmap images skybox texture, , vertices stored in skyboxvertices[]. vertices causing skybox orientated incorrectly, i'm not sure how change them make correct. thanks.

skybox class:

static const glfloat skyboxvertices[] = { // positions  //right -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,  //left -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,  //up 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,  //down -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,  //back -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,  //front -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 };  class skybox {  public:    gluint skyboxshaderprogram;    gluint skyboxvao, skyboxvbo;    std::vector<const glchar*> skyboxfaces;    gluint skyboxtexture;     skybox();    void initskyboxbuffers();    void enableskyboxarrays(); }; 

skybox class methods:

void skybox::initskyboxbuffers() {  glgenvertexarrays( 1, &skyboxvao ); glgenbuffers( 1, &skyboxvbo ); glbindvertexarray( skyboxvao ); glbindbuffer( gl_array_buffer, skyboxvbo ); glbufferdata( gl_array_buffer, sizeof( skyboxvertices ), &skyboxvertices, gl_static_draw ); glenablevertexattribarray( 0 ); glvertexattribpointer( 0, 3, gl_float, gl_false, 3 * sizeof( glfloat ), ( glvoid * ) 0 ); glbindvertexarray(0);  }  skybox::skybox() {   skyboxshaderprogram = loadshaders("shaders/skyboxvertexshader.glsl", "shaders/skyboxfragmentshader.glsl"); initskyboxbuffers();  skyboxfaces.push_back( "textures/skybox/sunny/sunny_right.bmp" );  //textures/skybox/cloudtop_right.bmp skyboxfaces.push_back( "textures/skybox/sunny/sunny_left.bmp" );   //textures/skybox/cloudtop_left.bmp skyboxfaces.push_back( "textures/skybox/sunny/sunny_up.bmp" );     //textures/skybox/cloudtop_up.bmp skyboxfaces.push_back( "textures/skybox/sunny/sunny_down.bmp" );   //textures/skybox/cloudtop_down.bmp skyboxfaces.push_back( "textures/skybox/sunny/sunny_back.bmp" );   //textures/skybox/cloudtop_back.bmp skyboxfaces.push_back( "textures/skybox/sunny/sunny_front.bmp" );  //textures/skybox/cloudtop_front.bmp skyboxtexture = loadbmpskybox(skyboxfaces);  } 

part of class containing render loop:

shaderprogram = loadshaders("shaders/vertexshader.glsl", "shaders/fragmentshader.glsl"); gluseprogram( shaderprogram );  // read our .obj file bool res = loadassimp("obj/suzanne.obj", indices, indexed_vertices, indexed_uvs, indexed_normals);  glfwswapinterval(1);  glgenvertexarrays( 1, &vao ); glbindvertexarray( vao );  //vertex buffer: glgenbuffers( 1, &vbo ); glbindbuffer( gl_array_buffer, vbo ); glbufferdata( gl_array_buffer, indexed_vertices.size() * sizeof(glm::vec3), &indexed_vertices[0], gl_static_draw ); // bind vertex array object first, bind , set vertex buffer(s) , attribute pointer(s).  //uv buffer: glgenbuffers(1, &uvbuffer); glbindbuffer(gl_array_buffer, uvbuffer); glbufferdata(gl_array_buffer, indexed_uvs.size() * sizeof(glm::vec3), &indexed_uvs[0], gl_static_draw);  //normal buffer: glgenbuffers(1, &normalbuffer); glbindbuffer(gl_array_buffer, normalbuffer); glbufferdata(gl_array_buffer, indexed_normals.size() * sizeof(glm::vec3), &indexed_normals[0], gl_static_draw);  //element buffer: glgenbuffers(1, &elementbuffer); glbindbuffer(gl_element_array_buffer, elementbuffer); glbufferdata(gl_element_array_buffer, indices.size() * sizeof(unsigned int), &indices[0], gl_static_draw);  //enable z-buffer: requires gl_depth_buffer_bit in render loop. glenable(gl_depth_test); gldepthfunc(gl_less); glenable(gl_cull_face);  skybox = new skybox(); 

part of render loop:

controls->computematricesfrominputs(); mat4 projectionmatrix = controls->getprojectionmatrix(); mat4 viewmatrix = controls->getviewmatrix(); mat4 modelmatrix = mat4( 1.0 ); mat4 mvp = projectionmatrix * viewmatrix * modelmatrix; gluseprogram( shaderprogram );  //vertex glenablevertexattribarray( 0 ); glbindbuffer( gl_array_buffer, vbo ); glvertexattribpointer( 0, 3, gl_float, gl_false, 0, ( glvoid * ) 0 );     //uv glenablevertexattribarray(1); glbindbuffer(gl_array_buffer, uvbuffer); glvertexattribpointer( 1, 2, gl_float, gl_false, 0, ( glvoid * ) 0 );  //normal glenablevertexattribarray(2); glbindbuffer(gl_array_buffer, normalbuffer); glvertexattribpointer( 2, 3, gl_float, gl_false, 0, ( glvoid * ) 0 );  glbindvertexarray( vao );      // index buffer     glbindbuffer(gl_element_array_buffer, elementbuffer);      // draw vertices     gldrawelements(                    gl_triangles,      // mode                    indices.size(),    // count                    gl_unsigned_int,   // type                    (void*)0           // element array buffer offset                    );     glbindvertexarray(0);      //draw skybox last:     gldepthfunc( gl_lequal );     gluseprogram( skybox->skyboxshaderprogram );     viewmatrix = glm::mat4( glm::mat3( controls->getviewmatrix( ) ) );      gluniformmatrix4fv( glgetuniformlocation( skybox->skyboxshaderprogram, "view" ), 1, gl_false, glm::value_ptr( viewmatrix ) );     gluniformmatrix4fv( glgetuniformlocation( skybox->skyboxshaderprogram, "projection" ), 1, gl_false, glm::value_ptr( projectionmatrix ) );      // skybox cube     glbindvertexarray( skybox->skyboxvao );     glbindtexture( gl_texture_cube_map, skybox->skyboxtexture );     gldrawarrays( gl_triangles, 0, 36 );     glbindvertexarray( 0 );     gldepthfunc( gl_less ); // set depth function default      gldisablevertexattribarray(0);     gldisablevertexattribarray(1);     gldisablevertexattribarray(2);     gldisablevertexattribarray(3); 


Comments

Popular posts from this blog

inversion of control - Autofac named registration constructor injection -

verilog - Systemverilog dynamic casting issues -

ios - Change Storyboard View using Seague -