mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-01-06 03:29:44 -06:00
Update renderables to higher precision rendering by calculating M and V matrix in double precision.
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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()));
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
Reference in New Issue
Block a user