From 9612d3c290b0d0d5f2b224c7a075e8d7541ef5ee Mon Sep 17 00:00:00 2001 From: Lukas Joergensen Date: Mon, 25 Aug 2014 21:00:40 +0200 Subject: [PATCH 1/3] BlendTotal is now an actual total rather than a max --- Engine/source/terrain/hlsl/terrFeatureHLSL.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp b/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp index 6c94e0743..e5025cf30 100644 --- a/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp +++ b/Engine/source/terrain/hlsl/terrFeatureHLSL.cpp @@ -446,7 +446,7 @@ void TerrainDetailMapFeatHLSL::processPix( Vector &component } // Add to the blend total. - meta->addStatement( new GenOp( " @ = max( @, @ );\r\n", blendTotal, blendTotal, detailBlend ) ); + meta->addStatement( new GenOp( " @ += @;\r\n", blendTotal, detailBlend ) ); // If we had a parallax feature... then factor in the parallax // amount so that it fades out with the layer blending. From 53f241974bf425f94e76dedbcd8d86a8d9b52658 Mon Sep 17 00:00:00 2001 From: Lukas Joergensen Date: Mon, 25 Aug 2014 21:02:28 +0200 Subject: [PATCH 2/3] Doing a hard compare instead of using step for blending factors --- Templates/Empty/game/shaders/common/terrain/terrain.hlsl | 7 +++++-- Templates/Full/game/shaders/common/terrain/terrain.hlsl | 7 +++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/Templates/Empty/game/shaders/common/terrain/terrain.hlsl b/Templates/Empty/game/shaders/common/terrain/terrain.hlsl index 328acae7f..8ce497012 100644 --- a/Templates/Empty/game/shaders/common/terrain/terrain.hlsl +++ b/Templates/Empty/game/shaders/common/terrain/terrain.hlsl @@ -32,9 +32,12 @@ float calcBlend( float texId, float2 layerCoord, float layerSize, float4 layerSa float4 diff = saturate( abs( layerSample - texId ) ); float noBlend = any( 1 - diff ); - // Use step to see if any of the layer samples + // Check if any of the layer samples // match the current texture id. - float4 factors = step( texId, layerSample ); + float4 factors = 0; + for(int i = 0; i < 4; i++) + if(layerSample[i] == texId) + factors[i] = 1; // This is a custom bilinear filter. diff --git a/Templates/Full/game/shaders/common/terrain/terrain.hlsl b/Templates/Full/game/shaders/common/terrain/terrain.hlsl index 328acae7f..8ce497012 100644 --- a/Templates/Full/game/shaders/common/terrain/terrain.hlsl +++ b/Templates/Full/game/shaders/common/terrain/terrain.hlsl @@ -32,9 +32,12 @@ float calcBlend( float texId, float2 layerCoord, float layerSize, float4 layerSa float4 diff = saturate( abs( layerSample - texId ) ); float noBlend = any( 1 - diff ); - // Use step to see if any of the layer samples + // Check if any of the layer samples // match the current texture id. - float4 factors = step( texId, layerSample ); + float4 factors = 0; + for(int i = 0; i < 4; i++) + if(layerSample[i] == texId) + factors[i] = 1; // This is a custom bilinear filter. From ea4a8bb3615be431b51cb744adc8505ce6821286 Mon Sep 17 00:00:00 2001 From: Lukas Joergensen Date: Wed, 10 Sep 2014 01:21:52 +0200 Subject: [PATCH 3/3] Proper rendering of basetexture Now terrain basetexture is properly cleared and never transparent. --- Engine/source/terrain/terrRender.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/Engine/source/terrain/terrRender.cpp b/Engine/source/terrain/terrRender.cpp index 4b03ac812..ec4dec3dd 100644 --- a/Engine/source/terrain/terrRender.cpp +++ b/Engine/source/terrain/terrRender.cpp @@ -170,9 +170,10 @@ bool TerrainBlock::_initBaseShader() desc.zDefined = true; desc.zWriteEnable = false; desc.zEnable = false; - desc.setBlend( true, GFXBlendSrcAlpha, GFXBlendInvSrcAlpha ); + desc.setBlend( true, GFXBlendSrcAlpha, GFXBlendOne ); desc.cullDefined = true; desc.cullMode = GFXCullNone; + desc.colorWriteAlpha = false; mBaseShaderSB = GFX->createStateBlock( desc ); return true; @@ -251,6 +252,8 @@ void TerrainBlock::_updateBaseTexture( bool writeToCache ) mBaseTarget->attachTexture( GFXTextureTarget::Color0, blendTex ); GFX->setActiveRenderTarget( mBaseTarget ); + GFX->clear( GFXClearTarget, ColorI(0,0,0,255), 1.0f, 0 ); + GFX->setTexture( 0, mLayerTex ); mBaseShaderConsts->setSafe( mBaseLayerSizeConst, (F32)mLayerTex->getWidth() );