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:
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
Post a Comment