Atmosphere optimizations

This commit is contained in:
Emil Axelsson
2018-03-26 18:05:41 +02:00
parent 0899c499f0
commit 40dfbc5db5
2 changed files with 20 additions and 92 deletions

View File

@@ -243,17 +243,13 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData,
program.setUniform("SAMPLES_MU_S", _mu_s_samples);
program.setUniform("SAMPLES_NU", _nu_samples);
program.setUniform("ModelTransformMatrix", _modelTransform);
// Object Space
glm::dmat4 inverseModelMatrix = glm::inverse(_modelTransform);
program.setUniform("dInverseModelTransformMatrix", inverseModelMatrix);
program.setUniform("dModelTransformMatrix", _modelTransform);
glm::vec3 camPosModelCoords = inverseModelMatrix *
glm::dmat4 inverseModelMatrix = glm::inverse(_modelTransform);
glm::vec3 eyePosModelCoords = inverseModelMatrix *
glm::dvec4(renderData.camera.eyePositionVec3(), 1.0);
program.setUniform("camPosModelCoords", camPosModelCoords);
program.setUniform("eyePosModelCoords", eyePosModelCoords);
glm::dmat4 eyeToModel =
inverseModelMatrix *
@@ -262,68 +258,9 @@ void AtmosphereDeferredcaster::preRaycast(const RenderData& renderData,
program.setUniform("eyeToModel",
glm::mat4(eyeToModel));
glm::dmat4 clipToModel =
eyeToModel *
glm::inverse(glm::dmat4(renderData.camera.projectionMatrix()));
program.setUniform("clipToModel",
glm::mat4(clipToModel));
// The following scale comes from PSC transformations.
glm::dmat4 dfScaleCamTransf = glm::scale(glm::dvec3(1.0));
program.setUniform(
"dInverseScaleTransformMatrix",
glm::inverse(dfScaleCamTransf)
);
program.setUniform(
"dCamScaleTransform",
renderData.camera.viewScaleMatrix()
);
// World to Eye Space in OS
program.setUniform(
"dInverseCamScaleTransform",
glm::inverse(renderData.camera.viewScaleMatrix())
);
program.setUniform(
"dInverseCamRotTransform",
glm::mat4_cast(
static_cast<glm::dquat>(renderData.camera.rotationQuaternion())
)
);
// Eye Space in OS to Eye Space in SGCT
glm::dmat4 dOsEye2SGCTEye = glm::dmat4(renderData.camera.viewMatrix());
glm::dmat4 dSgctEye2OSEye = glm::inverse(dOsEye2SGCTEye);
program.setUniform("dSgctEyeToOSEyeTranform", dSgctEye2OSEye);
// Eye Space in SGCT to Projection (Clip) Space in SGCT
glm::dmat4 dSgctEye2Clip = glm::dmat4(renderData.camera.projectionMatrix());
glm::dmat4 dInverseProjection = glm::inverse(dSgctEye2Clip);
program.setUniform("dInverseSgctProjectionMatrix", dInverseProjection);
program.setUniform("dObjpos", glm::dvec4(renderData.position.dvec3(), 1.0));
glm::dvec3 campos = renderData.camera.eyePositionVec3();
program.setUniform("dCampos", campos);
glm::dvec3 camRigPos = renderData.camera.positionVec3();
program.setUniform("dCamRigPos", camRigPos);
glm::dmat4 tempTransform =
glm::mat4_cast(
static_cast<glm::dquat>(renderData.camera.rotationQuaternion())
) *
glm::inverse(renderData.camera.viewScaleMatrix()) *
dSgctEye2OSEye *
dInverseProjection;
program.setUniform("tempTransform", glm::mat4(tempTransform));
glm::mat4 invProjection =
glm::inverse(renderData.camera.projectionMatrix());
program.setUniform("inverseProjection", invProjection);
glm::dmat4 eyeToWorldTransform =
glm::inverse(renderData.camera.combinedViewMatrix());

View File

@@ -85,19 +85,15 @@ uniform sampler2DMS mainNormalTexture;
uniform sampler2DMS mainColorTexture;
// Model Transform Matrix Used for Globe Rendering
uniform dmat4 dInverseModelTransformMatrix;
uniform dmat4 dModelTransformMatrix;
//uniform dmat4 dSGCTEyeToOSWorldTransformMatrix;
uniform dmat4 eyeToWorld;
uniform mat4 eyeToModel;
uniform dmat4 eyeToWorld;
uniform mat4 clipToModel;
uniform mat4 tempTransform;
uniform mat4 inverseProjection;
uniform vec3 camPosModelCoords;
uniform vec3 eyePosModelCoords;
uniform dvec3 dCamRigPos;
uniform dvec3 dCampos;
uniform dvec3 sunDirectionObj;
uniform dvec3 ellipsoidRadii;
@@ -249,26 +245,21 @@ bool dAtmosphereIntersection(const dvec3 planetPosition, const dRay ray, const d
* wherever is possible.
*/
void dCalculateRayRenderableGlobe(in int mssaSample, out dRay ray) {
// ======================================
// ======= Avoiding Some Matrices =======
// Compute positions and directions in world space.
dvec2 samplePos = dvec2(msaaSamplePatter[mssaSample],
msaaSamplePatter[mssaSample+1]);
dvec4 clipCoords = dvec4(interpolatedNDCPos.xy + samplePos, 1.0, 1.0);
vec2 samplePos = vec2(msaaSamplePatter[mssaSample],
msaaSamplePatter[mssaSample+1]);
// Clip to World
dvec4 offsetWorldCoords = tempTransform * clipCoords;
dvec4 worldCoords = dvec4(dvec3(offsetWorldCoords) + dCampos, 1.0);
// World to Object
dvec4 objectCoords = dInverseModelTransformMatrix * worldCoords;
dvec4 clipCoords = dvec4(interpolatedNDCPos.xy + samplePos, 0.0, 1.0);
vec4 eyeSpaceCoords = inverseProjection * vec4(clipCoords);
eyeSpaceCoords.w = 1.0;
dvec4 objectCoords = eyeToModel * eyeSpaceCoords;
// ============================
// ====== Building Ray ========
// Ray in object space (in KM)
ray.origin = vec4(camPosModelCoords, 1.0) * dvec4(0.001, 0.001, 0.001, 1.0);
ray.direction = dvec4(normalize(objectCoords.xyz - camPosModelCoords.xyz), 0.0);
ray.origin = dvec4(vec4(eyePosModelCoords, 1.0) * dvec4(0.001, 0.001, 0.001, 1.0));
ray.direction = dvec4(normalize(objectCoords.xyz - eyePosModelCoords.xyz), 0.0);
}
/*
@@ -575,7 +566,7 @@ void main() {
// Ray in object space
dRay ray;
dvec4 planetPositionObjectCoords = dvec4(0.0, 0.0, 0.0, 1.0);
dvec4 cameraPositionInObject = dvec4(camPosModelCoords, 1.0);
dvec4 cameraPositionInObject = dvec4(eyePosModelCoords, 1.0);
// Get the ray from camera to atm in object space
dCalculateRayRenderableGlobe(i, ray);