Browse Source

Fix ORM maps in terrain textures

Fix default target for Composite Terrain GLSL
Lukas Aldershaab 4 years ago
parent
commit
49a8c0ad36

+ 25 - 16
Engine/source/terrain/glsl/terrFeatureGLSL.cpp

@@ -1260,7 +1260,7 @@ void TerrainORMMapFeatGLSL::processPix(Vector<ShaderComponent*> &componentList,
 
 	// search for material var
 	Var * ormConfig;
-	OutputTarget targ = RenderTarget1;
+	OutputTarget targ = DefaultTarget;
 	if (fd.features[MFT_isDeferred])
 	{
 		targ = RenderTarget2;
@@ -1283,23 +1283,20 @@ void TerrainORMMapFeatGLSL::processPix(Vector<ShaderComponent*> &componentList,
 	String matinfoName(String::ToString("matinfoCol%d", compositeIndex));
 	Var *matinfoCol = new Var(matinfoName, "vec3");
 
-	Var *priorComp = (Var*)LangElement::find(String::ToString("matinfoCol%d", compositeIndex - 1));
-	if (priorComp)
-	{
-		meta->addStatement(new GenOp("   @ = @.rgb*@;\r\n", new DecOp(matinfoCol), texOp, detailBlend));
-		meta->addStatement(new GenOp("   @.gba += @;\r\n", ormConfig, matinfoCol));
-	}
-	else
-	{
-		meta->addStatement(new GenOp("   @ = lerp(vec3(1.0,1.0,0.0),@.rgb,@);\r\n", new DecOp(matinfoCol), texOp, detailBlend));
-		meta->addStatement(new GenOp("   @ = vec4(0.0,@);\r\n", ormConfig, matinfoCol));
-	}
+   if (compositeIndex == 0)
+   {
+      meta->addStatement(new GenOp("   @ = vec4(0.0, 0.0, 0.0, 0.0);\r\n", ormConfig));
+   }
+
+   meta->addStatement(new GenOp("   @ = @.rgb;\r\n", new DecOp(matinfoCol), texOp));
 
-   if (fd.features[MFT_InvertRoughness])
+   if (fd.features.hasFeature(MFT_InvertRoughness, compositeIndex))
    {
-      meta->addStatement(new GenOp("   @.b = 1.0[email protected];\r\n", ormConfig, ormConfig));
+      meta->addStatement(new GenOp("   @.b = 1.0 - @.b;\r\n", matinfoCol, matinfoCol));
    }
 
+   meta->addStatement(new GenOp("   @.gba += @ * @;\r\n", ormConfig, matinfoCol, detailBlend));
+
 	output = meta;
 }
 
@@ -1321,9 +1318,11 @@ U32 TerrainBlankInfoMapFeatGLSL::getOutputTargets(const MaterialFeatureData &fd)
 void TerrainBlankInfoMapFeatGLSL::processPix(Vector<ShaderComponent*> &componentList,
    const MaterialFeatureData &fd)
 {
+   S32 compositeIndex = getProcessIndex();
+
    // search for material var
    Var *material;
-   OutputTarget targ = RenderTarget1;
+   OutputTarget targ = DefaultTarget;
    if (fd.features[MFT_isDeferred])
    {
       targ = RenderTarget2;
@@ -1340,7 +1339,17 @@ void TerrainBlankInfoMapFeatGLSL::processPix(Vector<ShaderComponent*> &component
       material->setStructName("OUT");
    }
 
-   meta->addStatement(new GenOp("   @ = vec4(0.0,1.0,1.0,0.0);\r\n", material));
+   if (compositeIndex == 0)
+   {
+      meta->addStatement(new GenOp("   @ = vec4(0.0, 0.0, 0.0, 0.0);\r\n", material));
+   }
+
+   Var* detailBlend = (Var*)LangElement::find(String::ToString("detailBlend%d", compositeIndex));
+   AssertFatal(detailBlend, "The detail blend is missing!");
+
+   String matinfoName(String::ToString("matinfoCol%d", compositeIndex));
+
+   meta->addStatement(new GenOp("   @.gba += vec3(@, @, 0.0);\r\n", material, detailBlend, detailBlend));
 
    output = meta;
 }

+ 22 - 13
Engine/source/terrain/hlsl/terrFeatureHLSL.cpp

@@ -1300,24 +1300,21 @@ void TerrainORMMapFeatHLSL::processPix(Vector<ShaderComponent*> &componentList,
 
    String matinfoName(String::ToString("matinfoCol%d", compositeIndex));
    Var *matinfoCol = new Var(matinfoName, "float3");
-   
-   Var *priorComp = (Var*)LangElement::find(String::ToString("matinfoCol%d", compositeIndex - 1));
-   if (priorComp)
-   {
-      meta->addStatement(new GenOp("   @ = @.rgb*@;\r\n", new DecOp(matinfoCol), texOp, detailBlend));
-      meta->addStatement(new GenOp("   @.gba += @;\r\n", ormConfig, matinfoCol));
-   }
-   else
+
+   if (compositeIndex == 0)
    {
-      meta->addStatement(new GenOp("   @ = lerp(float3(1.0,1.0,0.0),@.rgb,@);\r\n", new DecOp(matinfoCol), texOp, detailBlend));
-      meta->addStatement(new GenOp("   @ = float4(0.0,@);\r\n", ormConfig, matinfoCol));
+      meta->addStatement(new GenOp("   @ = float4(0.0, 0.0, 0.0, 0.0);\r\n", ormConfig));
    }
 
-   if (fd.features[MFT_InvertRoughness])
+   meta->addStatement(new GenOp("   @ = @.rgb;\r\n", new DecOp(matinfoCol), texOp));
+
+   if (fd.features.hasFeature(MFT_InvertRoughness, compositeIndex))
    {
-      meta->addStatement(new GenOp("   @.b = [email protected];\r\n", ormConfig, ormConfig));
+      meta->addStatement(new GenOp("   @.b = 1.0 - @.b;\r\n", matinfoCol, matinfoCol));
    }
 
+   meta->addStatement(new GenOp("   @.gba += @ * @;\r\n", ormConfig, matinfoCol, detailBlend));
+
    output = meta;
 }
 
@@ -1337,6 +1334,8 @@ U32 TerrainBlankInfoMapFeatHLSL::getOutputTargets(const MaterialFeatureData &fd)
 void TerrainBlankInfoMapFeatHLSL::processPix(Vector<ShaderComponent*> &componentList,
    const MaterialFeatureData &fd)
 {
+   S32 compositeIndex = getProcessIndex();
+
    // search for material var
    Var *material;
    OutputTarget targ = DefaultTarget;
@@ -1356,7 +1355,17 @@ void TerrainBlankInfoMapFeatHLSL::processPix(Vector<ShaderComponent*> &component
       material->setStructName("OUT");
    }
 
-   meta->addStatement(new GenOp("   @ = float4(0.0,1.0,1.0,0.0);\r\n", material));
+   if (compositeIndex == 0)
+   {
+      meta->addStatement(new GenOp("   @ = float4(0.0, 0.0, 0.0, 0.0);\r\n", material));
+   }
+
+   Var* detailBlend = (Var*)LangElement::find(String::ToString("detailBlend%d", compositeIndex));
+   AssertFatal(detailBlend, "The detail blend is missing!");
+
+   String matinfoName(String::ToString("matinfoCol%d", compositeIndex));
+
+   meta->addStatement(new GenOp("   @.gba += float3(@, @, 0.0);\r\n", material, detailBlend, detailBlend));
 
    output = meta;
 }

+ 5 - 3
Engine/source/terrain/terrCellMaterial.cpp

@@ -390,7 +390,6 @@ bool TerrainCellMaterial::_createPass( Vector<MaterialInfo*> *materials,
          // if HDR is not enabled in the engine.
          features.addFeature( MFT_HDROut );
       }
-      features.addFeature(MFT_DeferredTerrainBlankInfoMap);
 
       // Enable lightmaps and fogging if we're in BL.
       if ( reflectMat || useBLM )
@@ -444,10 +443,13 @@ bool TerrainCellMaterial::_createPass( Vector<MaterialInfo*> *materials,
             if (deferredMat)
                features.addFeature(MFT_isDeferred, featureIndex);
             features.addFeature(MFT_TerrainORMMap, featureIndex);
-            features.removeFeature(MFT_DeferredTerrainBlankInfoMap);
+         }
+         else
+         {
+            features.addFeature(MFT_DeferredTerrainBlankInfoMap, featureIndex);
          }
          if (mat->getInvertRoughness())
-            features.addFeature(MFT_InvertRoughness);
+            features.addFeature(MFT_InvertRoughness, featureIndex);
 
          pass->materials.push_back( (*materials)[i] );
          normalMaps.increment();