Browse Source

reflection probe updates

Tim Barnes 6 years ago
parent
commit
9a39afa0eb

+ 4 - 11
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");
 

+ 1 - 5
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);
 	};

+ 3 - 0
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() )

+ 1 - 0
Engine/source/materials/processedShaderMaterial.h

@@ -62,6 +62,7 @@ public:
    GFXShaderConstHandle* mModelViewProjSC;
    GFXShaderConstHandle* mWorldViewOnlySC;     
    GFXShaderConstHandle* mWorldToCameraSC;
+   GFXShaderConstHandle* mCameraToWorldSC;
    GFXShaderConstHandle* mWorldToObjSC;         
    GFXShaderConstHandle* mViewToObjSC;         
    GFXShaderConstHandle* mCubeTransSC;

+ 3 - 7
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);
    }
 }
 

+ 1 - 0
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");

+ 1 - 0
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;

+ 12 - 13
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;