From d8da75e9fb3419529c7fb22e830d46c103ef4720 Mon Sep 17 00:00:00 2001 From: Faerbit Date: Mon, 15 Dec 2014 11:45:31 +0100 Subject: [PATCH] Moving MVP calculation to the CPU side. --- Shader/depth.vsh | 5 ++--- Shader/phong.vsh | 4 ++-- graphics.cc | 20 ++++++++------------ level.cc | 4 ++-- level.hh | 2 +- object.cc | 10 ++++++---- object.hh | 2 +- 7 files changed, 22 insertions(+), 25 deletions(-) diff --git a/Shader/depth.vsh b/Shader/depth.vsh index e3eba6a..f84c3cf 100644 --- a/Shader/depth.vsh +++ b/Shader/depth.vsh @@ -4,9 +4,8 @@ in vec3 aPosition; in vec3 aNormal; in vec3 aTexcoord; -uniform mat4 viewProjectionMatrix; -uniform mat4 modelMatrix; +uniform mat4 modelViewProjectionMatrix; void main() { - gl_Position = viewProjectionMatrix * modelMatrix * vec4(aPosition, 1.0); + gl_Position = modelViewProjectionMatrix * vec4(aPosition, 1.0); } diff --git a/Shader/phong.vsh b/Shader/phong.vsh index d2f840e..46932e1 100644 --- a/Shader/phong.vsh +++ b/Shader/phong.vsh @@ -1,7 +1,7 @@ #version 150 uniform mat4 modelMatrix; -uniform mat4 lightingViewProjectionMatrix; +uniform mat4 modelViewProjectionMatrix; uniform mat4 shadowMVP_near; uniform mat4 shadowMVP_middle; uniform mat4 shadowMVP_far; @@ -25,5 +25,5 @@ void main() shadowCoord_near = shadowMVP_near * modelMatrix * vec4(aPosition, 1.0); shadowCoord_middle = shadowMVP_middle * modelMatrix * vec4(aPosition, 1.0); shadowCoord_far = shadowMVP_far * modelMatrix * vec4(aPosition, 1.0); - gl_Position = lightingViewProjectionMatrix * modelMatrix * vec4(aPosition, 1.0); + gl_Position = modelViewProjectionMatrix * vec4(aPosition, 1.0); } diff --git a/graphics.cc b/graphics.cc index 390713a..e2991d1 100644 --- a/graphics.cc +++ b/graphics.cc @@ -110,7 +110,7 @@ void Graphics::render() glm::mat4 depthViewProjectionMatrix_face = depthProjectionMatrix_pointlights * glm::lookAt(level->getLights()->at(i_pointlight).getPosition(), level->getLights()->at(i_pointlight).getPosition() + looking_directions[i_face], glm::vec3(0.0f, 1.0f, 0.0f)); depthShader->setUniform("viewProjectionMatrix", depthViewProjectionMatrix_face); - level->render(depthShader, false); + level->render(depthShader, false, depthViewProjectionMatrix_face); if (!framebuffer_cube->isFrameBufferObjectComplete()) { printf("Framebuffer incomplete, unknown error occured during shadow generation!\n"); } @@ -124,8 +124,7 @@ void Graphics::render() glm::vec3 sunVector = (level->getCameraCenter()->getPosition() + level->getDirectionalLight()->getPosition()); glm::mat4 depthViewProjectionMatrix_near = glm::ortho(-5, 5, -5, 5, -5, 5) * glm::lookAt(sunVector, level->getCameraCenter()->getPosition(), glm::vec3(0,1,0)); - depthShader->setUniform("viewProjectionMatrix", depthViewProjectionMatrix_near); - level->render(depthShader, false); + level->render(depthShader, false, depthViewProjectionMatrix_near); if (!framebuffer_near->isFrameBufferObjectComplete()) { printf("Framebuffer incomplete, unknown error occured during shadow generation!\n"); } @@ -135,8 +134,7 @@ void Graphics::render() glClear(GL_DEPTH_BUFFER_BIT); glm::mat4 depthViewProjectionMatrix_middle = glm::ortho(-20, 20, -20, 20, -20, 20) * glm::lookAt(sunVector, level->getCameraCenter()->getPosition(), glm::vec3(0,1,0)); - depthShader->setUniform("viewProjectionMatrix", depthViewProjectionMatrix_middle); - level->render(depthShader, false); + level->render(depthShader, false, depthViewProjectionMatrix_middle); if (!framebuffer_middle->isFrameBufferObjectComplete()) { printf("Framebuffer incomplete, unknown error occured during shadow generation!\n"); } @@ -146,8 +144,7 @@ void Graphics::render() glClear(GL_DEPTH_BUFFER_BIT); glm::mat4 depthViewProjectionMatrix_far = glm::ortho(-farPlane/2.0f, farPlane/2.0f, -farPlane/2.0f, farPlane/2.0f, -farPlane/2.0f, farPlane/2.0f) * glm::lookAt(sunVector, level->getCameraCenter()->getPosition(), glm::vec3(0,1,0)); - depthShader->setUniform("viewProjectionMatrix", depthViewProjectionMatrix_far); - level->render(depthShader, false); + level->render(depthShader, false, depthViewProjectionMatrix_far); if (!framebuffer_far->isFrameBufferObjectComplete()) { printf("Framebuffer incomplete, unknown error occured during shadow generation!\n"); } @@ -158,10 +155,6 @@ void Graphics::render() lightingShader->use(); - //set view and projection matrix - glm::mat4 lightingViewProjectionMatrix = glm::perspective(1.571f, (float)windowSize.x/(float)windowSize.y, 0.1f, farPlane) * buildViewMatrix(level); - lightingShader->setUniform("lightingViewProjectionMatrix", lightingViewProjectionMatrix); - //set lighting parameters if (level->getLights()->size() > 0) { lightingShader->setUniform("lightCount", (int) level->getLights()->size()); @@ -227,8 +220,11 @@ void Graphics::render() lightingShader->setUniform("ambientColor", level->getAmbientLight()); lightingShader->setUniform("camera", level->getCameraPosition()); + //set view and projection matrix + glm::mat4 lightingViewProjectionMatrix = glm::perspective(1.571f, (float)windowSize.x/(float)windowSize.y, 0.1f, farPlane) * buildViewMatrix(level); + // render the level - level->render(lightingShader, true); + level->render(lightingShader, true, lightingViewProjectionMatrix); } void Graphics::resize(glm::uvec2 windowSize) { diff --git a/level.cc b/level.cc index c78b7c7..1aa5a87 100644 --- a/level.cc +++ b/level.cc @@ -294,11 +294,11 @@ void Level::load() { cameraCenter = object; } -void Level::render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass) { +void Level::render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass, glm::mat4 viewProjectionMatrix) { for(unsigned int i = 0; irender(shader, lightingPass); + objects.at(i)->render(shader, lightingPass, viewProjectionMatrix); } } } diff --git a/level.hh b/level.hh index 0ceb9c5..5f84031 100644 --- a/level.hh +++ b/level.hh @@ -18,7 +18,7 @@ class Level { ~Level(); void load(); void update(float runTime, glm::vec2 mouseDelta,bool wPressed, bool aPressed,bool sPressed, bool dPressed); - void render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass); + void render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass, glm::mat4 viewProjectionMatrix); glm::vec3 getAmbientLight(); Light* getDirectionalLight(); std::vector* getLights(); diff --git a/object.cc b/object.cc index 6e4fe82..c7b808b 100644 --- a/object.cc +++ b/object.cc @@ -12,7 +12,8 @@ Object::Object() { Object::~Object() { } -void Object::render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass) { +void Object::render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass, glm::mat4 viewProjectionMatrix) { + glm::mat4 modelMatrix = glm::translate(getPosition()) * getRotation() * glm::scale(glm::vec3(model.getScale())); if (lightingPass) { // set lightning parameters for this object shader->setUniform("ambientFactor", material.getAmbientFactor()); @@ -20,10 +21,11 @@ void Object::render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass) shader->setUniform("specularFactor", material.getSpecularFactor()); shader->setUniform("shininess", material.getShininess()); shader->setTexture("uTexture", material.getReference(), 0); + // set model matrix + shader->setUniform( "modelMatrix", modelMatrix); } - // set model matrix - glm::mat4 modelMatrix = glm::translate(getPosition()) * getRotation() * glm::scale(glm::vec3(model.getScale())); - shader->setUniform( "modelMatrix", modelMatrix); + glm::mat4 mvp = viewProjectionMatrix * modelMatrix; + shader->setUniform("modelViewProjectionMatrix", mvp); // draw model.getReference()->render(); } diff --git a/object.hh b/object.hh index 526b90c..234efe8 100644 --- a/object.hh +++ b/object.hh @@ -15,7 +15,7 @@ class Object : public Entity { glm::vec3 position, glm::vec3 rotation); Object(); ~Object(); - void render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass); + void render(ACGL::OpenGL::SharedShaderProgram shader, bool lightingPass, glm::mat4 viewProjcetionMatrix); private: Model model; Material material;