mirror of
https://github.com/OpenSpace/OpenSpace.git
synced 2026-03-13 17:09:05 -05:00
Atmosphere optimizations
This commit is contained in:
@@ -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());
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user