Update renderables to higher precision rendering by calculating M and V matrix in double precision.

This commit is contained in:
Kalle Bladin
2016-08-24 16:16:31 -04:00
parent e2730a45ea
commit 5551da922d
6 changed files with 62 additions and 40 deletions

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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);
}

View File

@@ -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<GLsizei>(_vertices.size()));

View File

@@ -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;
}

View File

@@ -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;
}