/** * initGL() - create and configure OpenGL resources * * @return bool true if initialization is a success */ bool GLManager::initGL() { // success flag bool success = true; // generate program programID = glCreateProgram(); // enable z-buffer face culling glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); // transparency //glEnable(GL_BLEND); //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // enable vsync rate if (SDL_GL_SetSwapInterval(1) < 0) std::cout << "Swap Interval could not be set!" << std::endl; // vertex & fragment shaders vertexShader = 0; fragmentShader = 0; ShaderLoader loader; // load vertex shader int failCount = 0; while (vertexShader == 0) { vertexShader = loader.loadShader( OsType::osConvert("shaders/phongAttenuation.vert"), programID ); ++failCount; if (failCount >= 1000) { std::cout << "Loading vertexShader failed!" << std::endl; failCount = 0; break; } } // load fragment shader while (fragmentShader == 0) { fragmentShader = loader.loadShader( OsType::osConvert("shaders/phongAttenuation.frag"), programID ); ++failCount; if (failCount >= 1000) { std::cout << "Loading fragmentShader failed!" << std::endl; failCount = 0; break; } } // create VAO glGenVertexArrays(1, &VAO); // link OpenGL program glLinkProgram(programID); //Initialize clear color glClearColor(0.0, 0.0, 0.0, 1.0f); return success; }
// called on keyboard input void keyboard(unsigned char key, int x_pos, int y_pos ) { ShaderLoader programLoad; // Handle keyboard input - end program if((key == 27)||(key == 'q')||(key == 'Q')) { glutLeaveMainLoop(); } else if((key == 'w')||(key == 'W')) { forward = true; } else if((key == 'a')||(key == 'A')) { goLeft = true; } else if((key == 's')||(key == 'S')) { backward = true; } else if((key == 'd')||(key == 'D')) { goRight = true; } else if(key == '1') { programLoad.loadShader( vsFileName, fsFileName1, program ); viewType = 1; } else if(key == '2') { programLoad.loadShader( vsFileName, fsFileName2, program ); viewType = 2; } else if(key == '3') { programLoad.loadShader( vsFileName, fsFileName3, program ); viewType = 3; } else if(key == '4') { programLoad.loadShader( vsFileName, fsFileName4, program ); viewType = 4; } }
bool initialize() { // Initialize basic geometry and shaders for this example //this defines a cube, this is why a model loader is nice //you can also do this with a draw elements and indices, try to get that working Vertex geometry[] = { {{-1.0, -1.0, -1.0}, {0.0, 0.0, 0.0}}, {{-1.0, -1.0, 1.0}, {0.0, 0.0, 1.0}}, {{-1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}}, {{1.0, 1.0, -1.0}, {1.0, 1.0, 0.0}}, {{-1.0, -1.0, -1.0}, {0.0, 0.0, 0.0}}, {{-1.0, 1.0, -1.0}, {0.0, 1.0, 0.0}}, {{1.0, -1.0, 1.0}, {1.0, 0.0, 1.0}}, {{-1.0, -1.0, -1.0}, {0.0, 0.0, 0.0}}, {{1.0, -1.0, -1.0}, {1.0, 0.0, 0.0}}, {{1.0, 1.0, -1.0}, {1.0, 1.0, 0.0}}, {{1.0, -1.0, -1.0}, {1.0, 0.0, 0.0}}, {{-1.0, -1.0, -1.0}, {0.0, 0.0, 0.0}}, {{-1.0, -1.0, -1.0}, {0.0, 0.0, 0.0}}, {{-1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}}, {{-1.0, 1.0, -1.0}, {0.0, 1.0, 0.0}}, {{1.0, -1.0, 1.0}, {1.0, 0.0, 1.0}}, {{-1.0, -1.0, 1.0}, {0.0, 0.0, 1.0}}, {{-1.0, -1.0, -1.0}, {0.0, 0.0, 0.0}}, {{-1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}}, {{-1.0, -1.0, 1.0}, {0.0, 0.0, 1.0}}, {{1.0, -1.0, 1.0}, {1.0, 0.0, 1.0}}, {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}, {{1.0, -1.0, -1.0}, {1.0, 0.0, 0.0}}, {{1.0, 1.0, -1.0}, {1.0, 1.0, 0.0}}, {{1.0, -1.0, -1.0}, {1.0, 0.0, 0.0}}, {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}, {{1.0, -1.0, 1.0}, {1.0, 0.0, 1.0}}, {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}, {{1.0, 1.0, -1.0}, {1.0, 1.0, 0.0}}, {{-1.0, 1.0, -1.0}, {0.0, 1.0, 0.0}}, {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}, {{-1.0, 1.0, -1.0}, {0.0, 1.0, 0.0}}, {{-1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}}, {{1.0, 1.0, 1.0}, {1.0, 1.0, 1.0}}, {{-1.0, 1.0, 1.0}, {0.0, 1.0, 1.0}}, {{1.0, -1.0, 1.0}, {1.0, 0.0, 1.0}} }; // create a Vertex Buffer object to store this vertex info on the GPU glGenBuffers(1, &vbo_geometry); glBindBuffer(GL_ARRAY_BUFFER, vbo_geometry); glBufferData(GL_ARRAY_BUFFER, sizeof(geometry), geometry, GL_STATIC_DRAW); // loads shaders to program programLoad.loadShader( vsFileName, fsFileName, program ); // now we set the locations of the attributes and uniforms // this allows us to access them easily while rendering loc_position = glGetAttribLocation(program, const_cast<const char*>("v_position")); if(loc_position == -1) { std::cerr << "[F] POSITION NOT FOUND" << std::endl; return false; } loc_color = glGetAttribLocation(program, const_cast<const char*>("v_color")); if(loc_color == -1) { std::cerr << "[F] V_COLOR NOT FOUND" << std::endl; return false; } loc_mvpmat = glGetUniformLocation(program, const_cast<const char*>("mvpMatrix")); if(loc_mvpmat == -1) { std::cerr << "[F] MVPMATRIX NOT FOUND" << std::endl; return false; } //--Init the view and projection matrices // if you will be having a moving camera the view matrix will need to more dynamic // ...Like you should update it before you render more dynamic // for this project having them static will be fine view = glm::lookAt( glm::vec3(0.0, 8.0, -16.0), //Eye Position glm::vec3(0.0, 0.0, 0.0), //Focus point glm::vec3(0.0, 1.0, 0.0)); //Positive Y is up projection = glm::perspective( 45.0f, //the FoV typically 90 degrees is good which is what this is set to float(w)/float(h), //Aspect Ratio, so Circles stay Circular 0.01f, //Distance to the near plane, normally a small value like this 100.0f); //Distance to the far plane, //enable depth testing glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); //and its done return true; }
// initialize basic geometry and shaders for this example bool initialize( const char* filename) { // define model with model loader /*bool geometryLoadedCorrectly; Mesh object; ShaderLoader programLoad;*/ int index; std::vector<Mesh> meshes; ShaderLoader programLoad; // load the image info if( !loadInfo( filename, meshes, numImages ) ) { return false; } // loop through each planet for( index = 0; index < numImages; index++ ) { // Create a Vertex Buffer object to store this vertex info on the GPU glGenBuffers(1, &(images[index].vbo_geometry)); glBindBuffer(GL_ARRAY_BUFFER, images[index].vbo_geometry); glBufferData(GL_ARRAY_BUFFER, meshes[index].geometry.size()* sizeof(Vertex), &(meshes[index].geometry[0]), GL_STATIC_DRAW); // Create Texture object glGenTextures(1, &(images[index].texture)); glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, images[index].texture); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, images[index].imageCols, images[index].imageRows, 0, GL_RGBA, GL_UNSIGNED_BYTE, images[index].m_blob.data()); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glGenBuffers(1, &(images[index].normalbuffer)); glBindBuffer(GL_ARRAY_BUFFER, images[index].normalbuffer); glBufferData(GL_ARRAY_BUFFER, meshes[index].geometry.size() * sizeof(Vertex), &(meshes[index].geometry[0]), GL_STATIC_DRAW); //glBufferData(GL_ARRAY_BUFFER, meshes[index].geometry.size() * sizeof(Vertex), &(meshes[index].geometry[offsetof(Vertex,normals)]), GL_STATIC_DRAW); } //if( viewType == 0 ) //{ // loads shaders to program programLoad.loadShader( vsFileName, fsFileName1, program ); //} /* else { // loads shaders to program programLoad.loadShader( vsFileName, fsFileName1, program ); } */ // Get a handle for our "MVP" uniform loc_mvpmat = glGetUniformLocation(program, "mvpMatrix"); if(loc_mvpmat == -1) { std::cerr << "[F] MVP MATRIX NOT FOUND" << std::endl; return false; } viewMatrixID = glGetUniformLocation(program, "V"); if(viewMatrixID == -1) { std::cerr << "[F] VIEW NOT FOUND" << std::endl; return false; } modelMatrixID = glGetUniformLocation(program, "M"); if(modelMatrixID == -1) { std::cerr << "[F] MODEL NOT FOUND" << std::endl; return false; } /* // Get a handle for our buffers loc_position = glGetAttribLocation(program, "v_position"); if(loc_position == -1) { std::cerr << "[F] POSITION NOT FOUND" << std::endl; return false; } loc_texture = glGetAttribLocation(program, "v_color"); if(loc_texture == -1) { std::cerr << "[F] COLOR NOT FOUND" << std::endl; return false; } */ // Get a handle for our buffers loc_position = glGetAttribLocation(program, "v_position"); if(loc_position == -1) { std::cerr << "[F] POSITION NOT FOUND" << std::endl; return false; } loc_texture = glGetAttribLocation(program, "v_color"); if(loc_texture == -1) { std::cerr << "[F] UV NOT FOUND" << std::endl; return false; } vertexNormal_modelspaceID = glGetAttribLocation(program, "vertexNormal_modelspace"); if(vertexNormal_modelspaceID == -1) { std::cerr << "[F] NORMAL NOT FOUND" << std::endl; return false; } //--Init the view and projection matrices // if you will be having a moving camera the view matrix will need to more dynamic // ...Like you should update it before you render more dynamic // for this project having them static will be fine view = glm::lookAt( glm::vec3(0.0, 7.0, -23.0), //Eye Position glm::vec3(0.0, 0.0, 0.0), //Focus point glm::vec3(0.0, 1.0, 0.0)); //Positive Y is up projection = glm::perspective( 45.0f, //the FoV typically 90 degrees is good which is what this is set to float(w)/float(h), //Aspect Ratio, so Circles stay Circular 0.01f, //Distance to the near plane, normally a small value like this 100.0f); //Distance to the far plane //enable depth testing glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); //and its done return true; }