From 49a8c0ad36d4d1b2e1402c311d3c48f7c93053bf Mon Sep 17 00:00:00 2001 From: Lukas Aldershaab Date: Sat, 26 Dec 2020 20:02:37 +0100 Subject: [PATCH] Fix ORM maps in terrain textures Fix default target for Composite Terrain GLSL --- .../source/terrain/glsl/terrFeatureGLSL.cpp | 43 +++++++++++-------- .../source/terrain/hlsl/terrFeatureHLSL.cpp | 35 +++++++++------ Engine/source/terrain/terrCellMaterial.cpp | 8 ++-- 3 files changed, 53 insertions(+), 33 deletions(-) diff --git a/Engine/source/terrain/glsl/terrFeatureGLSL.cpp b/Engine/source/terrain/glsl/terrFeatureGLSL.cpp index 7c80f9854..1bd06c01c 100644 --- a/Engine/source/terrain/glsl/terrFeatureGLSL.cpp +++ b/Engine/source/terrain/glsl/terrFeatureGLSL.cpp @@ -1260,7 +1260,7 @@ void TerrainORMMapFeatGLSL::processPix(Vector &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 &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 (fd.features[MFT_InvertRoughness]) + if (compositeIndex == 0) { - meta->addStatement(new GenOp(" @.b = 1.0-@.b;\r\n", ormConfig, ormConfig)); + 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.hasFeature(MFT_InvertRoughness, compositeIndex)) + { + 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 &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 &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; } diff --git a/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp b/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp index 9b8b7debb..74f002193 100644 --- a/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp +++ b/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp @@ -1300,24 +1300,21 @@ void TerrainORMMapFeatHLSL::processPix(Vector &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) + + if (compositeIndex == 0) { - 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(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 = 1.0-@.b;\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 &componentList, const MaterialFeatureData &fd) { + S32 compositeIndex = getProcessIndex(); + // search for material var Var *material; OutputTarget targ = DefaultTarget; @@ -1356,7 +1355,17 @@ void TerrainBlankInfoMapFeatHLSL::processPix(Vector &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; } diff --git a/Engine/source/terrain/terrCellMaterial.cpp b/Engine/source/terrain/terrCellMaterial.cpp index c97a51682..7bcc252ff 100644 --- a/Engine/source/terrain/terrCellMaterial.cpp +++ b/Engine/source/terrain/terrCellMaterial.cpp @@ -390,7 +390,6 @@ bool TerrainCellMaterial::_createPass( Vector *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 *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();