From 5551da922d396442d295dd7fc468f343fa34b542 Mon Sep 17 00:00:00 2001 From: Kalle Bladin Date: Wed, 24 Aug 2016 16:16:31 -0400 Subject: [PATCH] Update renderables to higher precision rendering by calculating M and V matrix in double precision. --- modules/base/rendering/renderableplane.cpp | 31 ++++++++++++++----- modules/base/shaders/plane_fs.glsl | 6 ++-- modules/base/shaders/plane_vs.glsl | 16 +++++----- .../rendering/renderableshadowcylinder.cpp | 18 +++++++++-- .../shaders/terminatorshadow_fs.glsl | 9 +++--- .../shaders/terminatorshadow_vs.glsl | 22 ++++++------- 6 files changed, 62 insertions(+), 40 deletions(-) diff --git a/modules/base/rendering/renderableplane.cpp b/modules/base/rendering/renderableplane.cpp index b16652745d..a2e7ff9b08 100644 --- a/modules/base/rendering/renderableplane.cpp +++ b/modules/base/rendering/renderableplane.cpp @@ -185,10 +185,8 @@ bool RenderablePlane::deinitialize() { } void RenderablePlane::render(const RenderData& data) { - glm::mat4 transform = glm::mat4(1.0); - if (_billboard) - transform = glm::inverse(glm::mat4(data.camera.viewRotationMatrix())); - + glm::mat4 scaleTransform = glm::mat4(1.0); + // Activate shader _shader->activate(); if (_projectionListener){ @@ -200,13 +198,30 @@ void RenderablePlane::render(const RenderData& data) { float h = _texture->height(); float w = _texture->width(); float scale = h / w; - transform = glm::scale(transform, glm::vec3(1.f, scale, 1.f)); + scaleTransform = glm::scale(glm::mat4(1.0), glm::vec3(1.f, scale, 1.f)); } } - _shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); - _shader->setUniform("ModelTransform", transform); - setPscUniforms(*_shader.get(), data.camera, data.position); + // Model transform and view transform needs to be in double precision + glm::dmat4 rotationTransform; + if (_billboard) + rotationTransform = glm::inverse(glm::dmat4(data.camera.viewRotationMatrix())); + else + rotationTransform = glm::dmat4(data.modelTransform.rotation); + + glm::dmat4 modelTransform = + glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * + rotationTransform * + glm::dmat4(glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale))) * + glm::dmat4(scaleTransform); + glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + + _shader->setUniform("modelViewProjectionTransform", + data.camera.projectionMatrix() * glm::mat4(modelViewTransform)); + + //_shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); + //_shader->setUniform("ModelTransform", transform); + //setPscUniforms(*_shader.get(), data.camera, data.position); ghoul::opengl::TextureUnit unit; unit.activate(); diff --git a/modules/base/shaders/plane_fs.glsl b/modules/base/shaders/plane_fs.glsl index 778763430e..a8d20ee5b2 100644 --- a/modules/base/shaders/plane_fs.glsl +++ b/modules/base/shaders/plane_fs.glsl @@ -26,14 +26,12 @@ uniform float time; uniform sampler2D texture1; in vec2 vs_st; -in vec4 vs_position; +in vec4 vs_positionScreenSpace; #include "PowerScaling/powerScaling_fs.hglsl" #include "fragment.glsl" Fragment getFragment() { - vec4 position = vs_position; - float depth = pscDepth(position); vec4 diffuse; if(gl_FrontFacing) diffuse = texture(texture1, vs_st); @@ -51,7 +49,7 @@ Fragment getFragment() { Fragment frag; frag.color = diffuse; - frag.depth = depth; + frag.depth = vs_positionScreenSpace.w; return frag; } diff --git a/modules/base/shaders/plane_vs.glsl b/modules/base/shaders/plane_vs.glsl index c13225412f..45d0125d7e 100644 --- a/modules/base/shaders/plane_vs.glsl +++ b/modules/base/shaders/plane_vs.glsl @@ -24,26 +24,24 @@ #version __CONTEXT__ -uniform mat4 ViewProjection; -uniform mat4 ModelTransform; +uniform mat4 modelViewProjectionTransform; layout(location = 0) in vec4 in_position; layout(location = 1) in vec2 in_st; out vec2 vs_st; -out vec4 vs_position; +out vec4 vs_positionScreenSpace; out float s; #include "PowerScaling/powerScaling_vs.hglsl" void main() { - vec4 tmp = in_position; - vec4 position = pscTransform(tmp, ModelTransform); + // Transform the damn psc to homogenous coordinate + vec4 position = vec4(in_position.xyz * pow(10, in_position.w), 1); + vec4 positionClipSpace = modelViewProjectionTransform * position; + vs_positionScreenSpace = z_normalization(positionClipSpace); + gl_Position = vs_positionScreenSpace; - vs_position = tmp; vs_st = in_st; - - position = ViewProjection * position; - gl_Position = z_normalization(position); } \ No newline at end of file diff --git a/modules/newhorizons/rendering/renderableshadowcylinder.cpp b/modules/newhorizons/rendering/renderableshadowcylinder.cpp index f7e84935ee..6e4b9930cd 100644 --- a/modules/newhorizons/rendering/renderableshadowcylinder.cpp +++ b/modules/newhorizons/rendering/renderableshadowcylinder.cpp @@ -111,10 +111,22 @@ void RenderableShadowCylinder::render(const RenderData& data){ glDepthMask(false); _shader->activate(); - _shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); - _shader->setUniform("ModelTransform", glm::mat4(_stateMatrix)); + // Model transform and view transform needs to be in double precision + glm::dmat4 modelTransform = + glm::translate(glm::dmat4(1.0), data.modelTransform.translation) * // Translation + glm::dmat4(data.modelTransform.rotation) * // Spice rotation + glm::dmat4(glm::scale(glm::dmat4(1.0), glm::dvec3(data.modelTransform.scale))); + glm::dmat4 modelViewTransform = data.camera.combinedViewMatrix() * modelTransform; + + _shader->setUniform("modelViewProjectionTransform", + data.camera.projectionMatrix() * glm::mat4(modelViewTransform)); + + //_shader->setUniform("ViewProjection", data.camera.viewProjectionMatrix()); + //_shader->setUniform("ModelTransform", glm::mat4(_stateMatrix)); + + _shader->setUniform("shadowColor", _shadowColor); - setPscUniforms(*_shader.get(), data.camera, data.position); + //setPscUniforms(*_shader.get(), data.camera, data.position); glBindVertexArray(_vao); glDrawArrays(GL_TRIANGLE_STRIP, 0, static_cast(_vertices.size())); diff --git a/modules/newhorizons/shaders/terminatorshadow_fs.glsl b/modules/newhorizons/shaders/terminatorshadow_fs.glsl index ca3301e649..82af216b65 100644 --- a/modules/newhorizons/shaders/terminatorshadow_fs.glsl +++ b/modules/newhorizons/shaders/terminatorshadow_fs.glsl @@ -22,8 +22,10 @@ * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ -in vec4 vs_point_position; +//in vec4 vs_point_position; +in vec4 vs_positionScreenSpace; in vec4 vs_point_velocity; + //in float fade; //uniform float forceFade; @@ -35,12 +37,9 @@ in vec4 vs_color; #include "fragment.glsl" Fragment getFragment() { - vec4 position = vs_point_position; - float depth = pscDepth(position); - Fragment frag; frag.color = vs_color; - frag.depth = depth; + frag.depth = vs_positionScreenSpace.w; return frag; } diff --git a/modules/newhorizons/shaders/terminatorshadow_vs.glsl b/modules/newhorizons/shaders/terminatorshadow_vs.glsl index a944a28691..5b1c864925 100644 --- a/modules/newhorizons/shaders/terminatorshadow_vs.glsl +++ b/modules/newhorizons/shaders/terminatorshadow_vs.glsl @@ -24,16 +24,17 @@ #version __CONTEXT__ -uniform mat4 ViewProjection; -uniform mat4 ModelTransform; +//uniform mat4 ViewProjection; +//uniform mat4 ModelTransform; + +uniform mat4 modelViewProjectionTransform; uniform vec4 objectVelocity; - - layout(location = 0) in vec4 in_point_position; -out vec4 vs_point_position; +//out vec4 vs_point_position; out vec4 vs_color; +out vec4 vs_positionScreenSpace; //out float fade; uniform uint nVertices; @@ -52,10 +53,9 @@ void main() { vs_color = vec4(0); } - vec4 tmp = in_point_position; - //tmp = psc_to_meter(tmp, vec2(1,0.f)); - vec4 position = pscTransform(tmp, ModelTransform); - vs_point_position = tmp; - position = ViewProjection * position; - gl_Position = z_normalization(position); + // Transform the damn psc to homogenous coordinate + vec4 position = vec4(in_point_position.xyz * pow(10, in_point_position.w), 1); + vec4 positionClipSpace = modelViewProjectionTransform * position; + vs_positionScreenSpace = z_normalization(positionClipSpace); + gl_Position = vs_positionScreenSpace; } \ No newline at end of file