From 9a39afa0ebe63c81d46eab48adfabb422cc627d2 Mon Sep 17 00:00:00 2001 From: Tim Barnes Date: Sun, 28 Oct 2018 20:42:26 +1000 Subject: [PATCH] reflection probe updates --- Engine/source/lighting/probeManager.cpp | 15 +++-------- Engine/source/lighting/probeManager.h | 6 +---- .../materials/processedShaderMaterial.cpp | 3 +++ .../materials/processedShaderMaterial.h | 1 + .../source/renderInstance/renderProbeMgr.cpp | 10 +++----- Engine/source/shaderGen/shaderGenVars.cpp | 1 + Engine/source/shaderGen/shaderGenVars.h | 1 + .../lighting/advanced/reflectionProbeP.hlsl | 25 +++++++++---------- 8 files changed, 26 insertions(+), 36 deletions(-) diff --git a/Engine/source/lighting/probeManager.cpp b/Engine/source/lighting/probeManager.cpp index 6e6aefc72..24e802751 100644 --- a/Engine/source/lighting/probeManager.cpp +++ b/Engine/source/lighting/probeManager.cpp @@ -794,7 +794,6 @@ ProbeManager::ReflectProbeMaterialInfo::ReflectProbeMaterialInfo(const String &m probeWSPos(NULL), attenuation(NULL), radius(NULL), - invViewMat(NULL), cubeMips(NULL) { Material *mat = MATMGR->getMaterialDefinitionByName(matName); @@ -819,8 +818,6 @@ ProbeManager::ReflectProbeMaterialInfo::ReflectProbeMaterialInfo(const String &m negFarPlaneDotEye = matInstance->getMaterialParameterHandle("$negFarPlaneDotEye"); zNearFarInvNearFar = matInstance->getMaterialParameterHandle("$zNearFarInvNearFar"); - invViewMat = matInstance->getMaterialParameterHandle("$invViewMat"); - useCubemap = matInstance->getMaterialParameterHandle("$useCubemap"); cubemap = matInstance->getMaterialParameterHandle("$cubeMap"); @@ -848,7 +845,7 @@ void ProbeManager::ReflectProbeMaterialInfo::setViewParameters(const F32 _zNear, const F32 _zFar, const Point3F &_eyePos, const PlaneF &_farPlane, - const PlaneF &_vsFarPlane, const MatrixF &_inverseViewMatrix) + const PlaneF &_vsFarPlane) { MaterialParameters *matParams = matInstance->getMaterialParameters(); @@ -865,8 +862,6 @@ void ProbeManager::ReflectProbeMaterialInfo::setViewParameters(const F32 _zNear, matParams->setSafe(zNearFarInvNearFar, Point4F(_zNear, _zFar, 1.0f / _zNear, 1.0f / _zFar)); - matParams->setSafe(invViewMat, _inverseViewMatrix); - Point4F frPlane = *((const Point4F *)&_farPlane); Point4F vsFrPlane = *((const Point4F *)&_vsFarPlane); Point4F nearFarInvNearFar = Point4F(_zNear, _zFar, 1.0f / _zNear, 1.0f / _zFar); @@ -893,10 +888,10 @@ void ProbeManager::ReflectProbeMaterialInfo::setProbeParameters(const ProbeRende if (total > 0.0f) attenRatio /= total; - F32 radius = probeInfo->mRadius; + F32 probeRadius = probeInfo->mRadius; - Point2F attenParams((1.0f / radius) * attenRatio.y, - (1.0f / (radius * radius)) * attenRatio.z); + Point2F attenParams((1.0f / probeRadius) * attenRatio.y, + (1.0f / (probeRadius * probeRadius)) * attenRatio.z); matParams->setSafe(attenuation, attenParams); @@ -996,8 +991,6 @@ ProbeManager::SkylightMaterialInfo::SkylightMaterialInfo(const String &matName, negFarPlaneDotEye = matInstance->getMaterialParameterHandle("$negFarPlaneDotEye"); zNearFarInvNearFar = matInstance->getMaterialParameterHandle("$zNearFarInvNearFar"); - invViewMat = matInstance->getMaterialParameterHandle("$invViewMat"); - useCubemap = matInstance->getMaterialParameterHandle("$useCubemap"); cubemap = matInstance->getMaterialParameterHandle("$cubeMap"); diff --git a/Engine/source/lighting/probeManager.h b/Engine/source/lighting/probeManager.h index 295ec3a2b..8ac8b361f 100644 --- a/Engine/source/lighting/probeManager.h +++ b/Engine/source/lighting/probeManager.h @@ -231,9 +231,6 @@ public: // -dot( farPlane, eyePos ) MaterialParameterHandle *negFarPlaneDotEye; - // Inverse View matrix - MaterialParameterHandle *invViewMat; - // Light Parameters MaterialParameterHandle *probeLSPos; MaterialParameterHandle *probeWSPos; @@ -262,8 +259,7 @@ public: const F32 zFar, const Point3F &eyePos, const PlaneF &farPlane, - const PlaneF &_vsFarPlane, - const MatrixF &_inverseViewMatrix); + const PlaneF &_vsFarPlane); void setProbeParameters(const ProbeRenderInst *probe, const SceneRenderState* renderState, const MatrixF &worldViewOnly); }; diff --git a/Engine/source/materials/processedShaderMaterial.cpp b/Engine/source/materials/processedShaderMaterial.cpp index a171e5c13..7de58d83d 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -75,6 +75,7 @@ void ShaderConstHandles::init( GFXShader *shader, CustomMaterial* mat /*=NULL*/ mModelViewProjSC = shader->getShaderConstHandle(ShaderGenVars::modelview); mWorldViewOnlySC = shader->getShaderConstHandle(ShaderGenVars::worldViewOnly); mWorldToCameraSC = shader->getShaderConstHandle(ShaderGenVars::worldToCamera); + mCameraToWorldSC = shader->getShaderConstHandle(ShaderGenVars::cameraToWorld); mWorldToObjSC = shader->getShaderConstHandle(ShaderGenVars::worldToObj); mViewToObjSC = shader->getShaderConstHandle(ShaderGenVars::viewToObj); mCubeTransSC = shader->getShaderConstHandle(ShaderGenVars::cubeTrans); @@ -1239,6 +1240,8 @@ void ProcessedShaderMaterial::setTransforms(const MatrixSet &matrixSet, SceneRen shaderConsts->set( handles->mWorldToObjSC, matrixSet.getWorldToObject() ); if ( handles->mWorldToCameraSC->isValid() ) shaderConsts->set( handles->mWorldToCameraSC, matrixSet.getWorldToCamera() ); + if (handles->mCameraToWorldSC->isValid()) + shaderConsts->set(handles->mCameraToWorldSC, matrixSet.getCameraToWorld()); if ( handles->mWorldViewOnlySC->isValid() ) shaderConsts->set( handles->mWorldViewOnlySC, matrixSet.getObjectToCamera() ); if ( handles->mViewToObjSC->isValid() ) diff --git a/Engine/source/materials/processedShaderMaterial.h b/Engine/source/materials/processedShaderMaterial.h index 130e7f8bd..464f7e20f 100644 --- a/Engine/source/materials/processedShaderMaterial.h +++ b/Engine/source/materials/processedShaderMaterial.h @@ -62,6 +62,7 @@ public: GFXShaderConstHandle* mModelViewProjSC; GFXShaderConstHandle* mWorldViewOnlySC; GFXShaderConstHandle* mWorldToCameraSC; + GFXShaderConstHandle* mCameraToWorldSC; GFXShaderConstHandle* mWorldToObjSC; GFXShaderConstHandle* mViewToObjSC; GFXShaderConstHandle* mCubeTransSC; diff --git a/Engine/source/renderInstance/renderProbeMgr.cpp b/Engine/source/renderInstance/renderProbeMgr.cpp index f75be6fd1..ba0e75bf5 100644 --- a/Engine/source/renderInstance/renderProbeMgr.cpp +++ b/Engine/source/renderInstance/renderProbeMgr.cpp @@ -159,13 +159,9 @@ void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state) MatrixSet &matrixSet = getRenderPass()->getMatrixSet(); matrixSet.restoreSceneViewProjection(); - const MatrixF &worldToCameraXfm = matrixSet.getWorldToCamera(); + const MatrixF &worldToCameraXfm = matrixSet.getCameraToWorld(); MatrixF inverseViewMatrix = worldToCameraXfm; - //inverseViewMatrix.fullInverse(); - //inverseViewMatrix.transpose(); - - //inverseViewMatrix = MatrixF::Identity; // Parameters calculated, assign them to the materials ProbeManager::SkylightMaterialInfo* skylightMat = PROBEMGR->getSkylightMaterial(); @@ -176,7 +172,7 @@ void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state) frustum.getFarDist(), frustum.getPosition(), farPlane, - vsFarPlane, inverseViewMatrix); + vsFarPlane); } ProbeManager::ReflectProbeMaterialInfo* reflProbeMat = PROBEMGR->getReflectProbeMaterial(); @@ -187,7 +183,7 @@ void RenderProbeMgr::_setupPerFrameParameters(const SceneRenderState *state) frustum.getFarDist(), frustum.getPosition(), farPlane, - vsFarPlane, inverseViewMatrix); + vsFarPlane); } } diff --git a/Engine/source/shaderGen/shaderGenVars.cpp b/Engine/source/shaderGen/shaderGenVars.cpp index fc6b6f853..60de56410 100644 --- a/Engine/source/shaderGen/shaderGenVars.cpp +++ b/Engine/source/shaderGen/shaderGenVars.cpp @@ -26,6 +26,7 @@ const String ShaderGenVars::modelview("$modelview"); const String ShaderGenVars::worldViewOnly("$worldViewOnly"); const String ShaderGenVars::worldToCamera("$worldToCamera"); +const String ShaderGenVars::cameraToWorld("$cameraToWorld"); const String ShaderGenVars::worldToObj("$worldToObj"); const String ShaderGenVars::viewToObj("$viewToObj"); const String ShaderGenVars::cubeTrans("$cubeTrans"); diff --git a/Engine/source/shaderGen/shaderGenVars.h b/Engine/source/shaderGen/shaderGenVars.h index 0b5e606e6..a0ed88860 100644 --- a/Engine/source/shaderGen/shaderGenVars.h +++ b/Engine/source/shaderGen/shaderGenVars.h @@ -35,6 +35,7 @@ struct ShaderGenVars const static String modelview; const static String worldViewOnly; const static String worldToCamera; + const static String cameraToWorld; const static String worldToObj; const static String viewToObj; const static String cubeTrans; diff --git a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl index c572ff11f..5591b506f 100644 --- a/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl +++ b/Templates/Full/game/shaders/common/lighting/advanced/reflectionProbeP.hlsl @@ -29,8 +29,8 @@ uniform float4 vsFarPlane; uniform float radius; uniform float2 attenuation; -uniform float4x4 invViewMat; uniform float4x4 worldToObj; +uniform float4x4 cameraToWorld; uniform float3 eyePosWorld; uniform float3 bbMin; @@ -175,27 +175,26 @@ PS_OUTPUT main( ConvexConnectP IN ) clip(-1); // Need world-space normal. - float3 wsNormal = mul(float4(normal, 1), invViewMat).rgb; + float3 wsNormal = mul(cameraToWorld, float4(normal, 0)).xyz; - float3 eyeRay = getDistanceVectorToPlane( -vsFarPlane.w, IN.vsEyeDir.xyz, vsFarPlane ); - float3 viewSpacePos = eyeRay * depth; + float3 vsEyeRay = getDistanceVectorToPlane( -vsFarPlane.w, IN.vsEyeDir.xyz, vsFarPlane ); + float3 vsPos = vsEyeRay * depth; - float3 wsEyeRay = mul(float4(eyeRay, 1), invViewMat).rgb; - - // Use eye ray to get ws pos - float3 worldPos = float3(eyePosWorld + wsEyeRay * depth); + float3 wsEyeRay = mul(cameraToWorld, float4(vsEyeRay, 0)).xyz; + // calculate world space position + float3 wsPos = float3(eyePosWorld + wsEyeRay * depth); float blendVal = 1.0; //clip bounds and (TODO properly: set falloff) if(useSphereMode) { - blendVal = defineSphereSpaceInfluence(probeLSPos, radius, attenuation, viewSpacePos, normal); + blendVal = defineSphereSpaceInfluence(probeLSPos, radius, attenuation, vsPos, normal); } else { float tempAttenVal = 3.5; - blendVal = defineBoxSpaceInfluence(worldPos, probeWSPos, radius, tempAttenVal); + blendVal = defineBoxSpaceInfluence(wsPos, probeWSPos, radius, tempAttenVal); } clip(blendVal); @@ -204,9 +203,9 @@ PS_OUTPUT main( ConvexConnectP IN ) //render into the bound space defined above - float3 surfToEye = normalize(worldPos.xyz-eyePosWorld.xyz); - Output.diffuse = float4(iblBoxDiffuse(wsNormal, worldPos, TORQUE_SAMPLERCUBE_MAKEARG(irradianceCubemap), probeWSPos, bbMin, bbMax), blendVal); - Output.spec = float4(iblBoxSpecular(wsNormal, worldPos, 1.0 - matInfo.b, surfToEye, TORQUE_SAMPLER2D_MAKEARG(BRDFTexture), TORQUE_SAMPLERCUBE_MAKEARG(cubeMap), probeWSPos, bbMin, bbMax), blendVal); + float3 surfToEye = normalize(wsPos - eyePosWorld); + Output.diffuse = float4(iblBoxDiffuse(wsNormal, wsPos, TORQUE_SAMPLERCUBE_MAKEARG(irradianceCubemap), probeWSPos, bbMin, bbMax), blendVal); + Output.spec = float4(iblBoxSpecular(wsNormal, wsPos, 1.0 - matInfo.b, surfToEye, TORQUE_SAMPLER2D_MAKEARG(BRDFTexture), TORQUE_SAMPLERCUBE_MAKEARG(cubeMap), probeWSPos, bbMin, bbMax), blendVal); Output.diffuse.rgb *= matInfo.g; Output.spec.rgb *= matInfo.g; return Output;