//renders a single `ModelInstance` static void RenderInstance(const ModelInstance& inst) { ModelAsset* asset = inst.asset; tdogl::Program* shaders = asset->shaders; //bind the shaders shaders->use(); //set the shader uniforms shaders->setUniform("camera", gCamera.matrix()); shaders->setUniform("model", inst.transform); shaders->setUniform("material.tex", 0); //set to 0 because the texture will be bound to GL_TEXTURE0 shaders->setUniform("material.shininess", asset->shininess); shaders->setUniform("material.specularColor", asset->specularColor); shaders->setUniform("light.position", gLight.position); shaders->setUniform("light.intensities", gLight.intensities); shaders->setUniform("light.attenuation", gLight.attenuation); shaders->setUniform("light.ambientCoefficient", gLight.ambientCoefficient); shaders->setUniform("cameraPosition", gCamera.position()); //bind the texture glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, asset->texture->object()); //bind VAO and draw glBindVertexArray(asset->vao); glDrawArrays(asset->drawType, asset->drawStart, asset->drawCount); //unbind everything glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); shaders->stopUsing(); }
static void Render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST); glClearColor(0.0, 0.1, 0.1, 1.0); //set the background glUseProgram(gProgram->object()); gProgram -> setUniform("camera", gCamera.matrix()); gProgram -> setUniform("model", glm::rotate(glm::mat4(), gDegreesRotated, Axis)); gProgram -> setUniform("light.position", gLight.position); gProgram -> setUniform("light.intensities",gLight.intensities); gProgram -> setUniform("materialSpecularColor", specularColor); gProgram -> setUniform("materialShininess", material_shininess); gProgram -> setUniform("light.attenuation", gLight.attenuation); gProgram -> setUniform("light.ambientCoefficient", gLight.ambientCoefficient); gProgram -> setUniform("cameraPosition", gCamera.position()); glBindVertexArray(gVAO); glDrawArrays(GL_TRIANGLES, 0, NumVertices); glBindVertexArray(0); //glFlush(); gProgram -> stopUsing(); glShadeModel(GL_SMOOTH); glEnable(GL_DEPTH); glfwSwapBuffers(); }
static void RenderInstance(const ModelInstance& inst) { ModelAsset* asset = inst.asset; tdogl::Program* shaders = asset->shaders; //bind the shaders shaders->use(); shaders->setUniform("gCameraPos", gCamera.position()); //set the shader uniforms shaders->setUniform("camera", gCamera.matrix()); shaders->setUniform("model", inst.transform); //shaders->setUniform("materialTex", 0); //set to 0 because the texture will be bound to GL_TEXTURE0 //bind the texture glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, asset->texture->object()); //bind VAO and draw glBindVertexArray(asset->vao); glDrawArrays(asset->drawType, asset->drawStart, asset->drawCount); //unbind everything glBindVertexArray(0); glBindTexture(GL_TEXTURE_2D, 0); shaders->stopUsing(); }
void Update(float secondsElapsed, GLFWwindow* window) { const GLfloat degreesPerSecond = 180.0f; //const GLfloat degreesPerSecond = 0.0f; gDegreesRotated += secondsElapsed * degreesPerSecond; while (gDegreesRotated > 360.0f) gDegreesRotated -= 360.0f; gInstances.front().transform = glm::rotate(glm::mat4(), gDegreesRotated, glm::vec3(0, 1, 0)); //move position of camera based on WASD keys const float moveSpeed = 4.0; //units per second if (glfwGetKey(window, 'S')) { gCamera.offsetPosition(secondsElapsed * moveSpeed * -gCamera.forward()); } else if (glfwGetKey(window, 'W')) { gCamera.offsetPosition(secondsElapsed * moveSpeed * gCamera.forward()); } if (glfwGetKey(window, 'A')) { gCamera.offsetPosition(secondsElapsed * moveSpeed * -gCamera.right()); } else if (glfwGetKey(window, 'D')) { gCamera.offsetPosition(secondsElapsed * moveSpeed * gCamera.right()); } if (glfwGetKey(window, 'Z')) { gCamera.offsetPosition(secondsElapsed * moveSpeed * -glm::vec3(0, 1, 0)); } else if (glfwGetKey(window, 'X')) { gCamera.offsetPosition(secondsElapsed * moveSpeed * glm::vec3(0, 1, 0)); } //move light if (glfwGetKey(window, '1')) gLight.position = gCamera.position(); // change light color if (glfwGetKey(window, '2')) gLight.intensities = glm::vec3(1, 0, 0); //red else if (glfwGetKey(window, '3')) gLight.intensities = glm::vec3(0, 1, 0); //green else if (glfwGetKey(window, '4')) gLight.intensities = glm::vec3(1, 1, 1); //white //rotate camera based on mouse movement const float mouseSensitivity = 0.1f; double mouseX, mouseY; glfwGetCursorPos(window, &mouseX, &mouseY); gCamera.offsetOrientation(mouseSensitivity * (float)mouseY, mouseSensitivity * (float)mouseX); glfwSetCursorPos(window, 0, 0); //reset the mouse, so it doesn't go out of the window const float zoomSensitivity = -0.2f; float fieldOfView = gCamera.fieldOfView() + zoomSensitivity * (float)gScrollY; if (fieldOfView < 5.0f) fieldOfView = 5.0f; if (fieldOfView > 130.0f) fieldOfView = 130.0f; gCamera.setFieldOfView(fieldOfView); gScrollY = 0; }
// update the scene based on the time elapsed since last update static void Update(float secondsElapsed) { //rotate the first instance in `gInstances` const GLfloat degreesPerSecond = 180.0f; gDegreesRotated += secondsElapsed * degreesPerSecond; while(gDegreesRotated > 360.0f) gDegreesRotated -= 360.0f; gInstances.front().transform = glm::rotate(glm::mat4(), gDegreesRotated, glm::vec3(0,1,0)); //move position of camera based on WASD keys, and XZ keys for up and down const float moveSpeed = 4.0; //units per second if(glfwGetKey('S')){ gCamera.offsetPosition(secondsElapsed * moveSpeed * -gCamera.forward()); } else if(glfwGetKey('W')){ gCamera.offsetPosition(secondsElapsed * moveSpeed * gCamera.forward()); } if(glfwGetKey('A')){ gCamera.offsetPosition(secondsElapsed * moveSpeed * -gCamera.right()); } else if(glfwGetKey('D')){ gCamera.offsetPosition(secondsElapsed * moveSpeed * gCamera.right()); } if(glfwGetKey('Z')){ gCamera.offsetPosition(secondsElapsed * moveSpeed * -glm::vec3(0,1,0)); } else if(glfwGetKey('X')){ gCamera.offsetPosition(secondsElapsed * moveSpeed * glm::vec3(0,1,0)); } //move light if(glfwGetKey('1')) gLight.position = gCamera.position(); // change light color if(glfwGetKey('2')) gLight.intensities = glm::vec3(1,0,0); //red else if(glfwGetKey('3')) gLight.intensities = glm::vec3(0,1,0); //green else if(glfwGetKey('4')) gLight.intensities = glm::vec3(1,1,1); //white //rotate camera based on mouse movement const float mouseSensitivity = 0.1f; int mouseX, mouseY; glfwGetMousePos(&mouseX, &mouseY); gCamera.offsetOrientation(mouseSensitivity * mouseY, mouseSensitivity * mouseX); glfwSetMousePos(0, 0); //reset the mouse, so it doesn't go out of the window //increase or decrease field of view based on mouse wheel const float zoomSensitivity = -0.2f; float fieldOfView = gCamera.fieldOfView() + zoomSensitivity * (float)glfwGetMouseWheel(); if(fieldOfView < 5.0f) fieldOfView = 5.0f; if(fieldOfView > 130.0f) fieldOfView = 130.0f; gCamera.setFieldOfView(fieldOfView); glfwSetMouseWheel(0); }
// the program starts here void AppMain() { // initialise GLFW glfwSetErrorCallback(OnError); if(!glfwInit()) throw std::runtime_error("glfwInit failed"); // open a window with GLFW glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); gWindow = glfwCreateWindow((int)SCREEN_SIZE.x, (int)SCREEN_SIZE.y, "OpenGL Tutorial", NULL, NULL); if(!gWindow) throw std::runtime_error("glfwCreateWindow failed. Can your hardware handle OpenGL 3.2?"); // GLFW settings glfwSetInputMode(gWindow, GLFW_CURSOR, GLFW_CURSOR_DISABLED); glfwSetCursorPos(gWindow, 0, 0); glfwSetScrollCallback(gWindow, OnScroll); glfwMakeContextCurrent(gWindow); // initialise GLEW glewExperimental = GL_TRUE; //stops glew crashing on OSX :-/ if(glewInit() != GLEW_OK) throw std::runtime_error("glewInit failed"); // GLEW throws some errors, so discard all the errors so far while(glGetError() != GL_NO_ERROR) {} // print out some info about the graphics drivers std::cout << "OpenGL version: " << glGetString(GL_VERSION) << std::endl; std::cout << "GLSL version: " << glGetString(GL_SHADING_LANGUAGE_VERSION) << std::endl; std::cout << "Vendor: " << glGetString(GL_VENDOR) << std::endl; std::cout << "Renderer: " << glGetString(GL_RENDERER) << std::endl; // make sure OpenGL version 3.2 API is available if(!GLEW_VERSION_3_2) throw std::runtime_error("OpenGL 3.2 API is not available."); // OpenGL settings glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // initialise the gWoodenCrate asset LoadWoodenCrateAsset(); // create all the instances in the 3D scene based on the gWoodenCrate asset CreateInstances(); // setup gCamera gCamera.setPosition(glm::vec3(-4,0,17)); gCamera.setViewportAspectRatio(SCREEN_SIZE.x / SCREEN_SIZE.y); gCamera.setNearAndFarPlanes(0.5f, 100.0f); // setup gLight gLight.position = gCamera.position(); gLight.intensities = glm::vec3(1,1,1); //white // run while the window is open float lastTime = (float)glfwGetTime(); while(!glfwWindowShouldClose(gWindow)){ // process pending events glfwPollEvents(); // update the scene based on the time elapsed since last update float thisTime = (float)glfwGetTime(); Update(thisTime - lastTime); lastTime = thisTime; // draw one frame Render(); // check for errors GLenum error = glGetError(); if(error != GL_NO_ERROR) std::cerr << "OpenGL Error " << error << std::endl; //exit program if escape key is pressed if(glfwGetKey(gWindow, GLFW_KEY_ESCAPE)) glfwSetWindowShouldClose(gWindow, GL_TRUE); } // clean up and exit glfwTerminate(); }