diff --git a/Engine/source/lighting/advanced/glsl/advancedLightingFeaturesGLSL.cpp b/Engine/source/lighting/advanced/glsl/advancedLightingFeaturesGLSL.cpp index e5830a519..24325d14f 100644 --- a/Engine/source/lighting/advanced/glsl/advancedLightingFeaturesGLSL.cpp +++ b/Engine/source/lighting/advanced/glsl/advancedLightingFeaturesGLSL.cpp @@ -142,29 +142,7 @@ void DeferredRTLightingFeatGLSL::processPix( Vector &component String unconditionLightInfo = String::ToLower( AdvancedLightBinManager::smBufferName ) + "Uncondition"; meta->addStatement( new GenOp( avar( " %s(tex2D(@, @), @, @, @);\r\n", unconditionLightInfo.c_str() ), lightInfoBuffer, uvScene, d_lightcolor, d_NL_Att, d_specular ) ); - - // If this has an interlaced pre-pass, do averaging here - if( fd.features[MFT_InterlacedDeferred] ) - { - Var *oneOverTargetSize = (Var*) LangElement::find( "oneOverTargetSize" ); - if( !oneOverTargetSize ) - { - oneOverTargetSize = new Var; - oneOverTargetSize->setType( "vec2" ); - oneOverTargetSize->setName( "oneOverTargetSize" ); - oneOverTargetSize->uniform = true; - oneOverTargetSize->constSortPos = cspPass; - } - - meta->addStatement( new GenOp( " float id_NL_Att, id_specular;\r\n vec3 id_lightcolor;\r\n" ) ); - meta->addStatement( new GenOp( avar( " %s(tex2D(@, @ + vec2(0.0, @.y)), id_lightcolor, id_NL_Att, id_specular);\r\n", - unconditionLightInfo.c_str() ), lightInfoBuffer, uvScene, oneOverTargetSize ) ); - - meta->addStatement( new GenOp(" @ = lerp(@, id_lightcolor, 0.5);\r\n", d_lightcolor, d_lightcolor ) ); - meta->addStatement( new GenOp(" @ = lerp(@, id_NL_Att, 0.5);\r\n", d_NL_Att, d_NL_Att ) ); - meta->addStatement( new GenOp(" @ = lerp(@, id_specular, 0.5);\r\n", d_specular, d_specular ) ); - } - + // This is kind of weak sauce if( !fd.features[MFT_VertLit] && !fd.features[MFT_ToneMap] && !fd.features[MFT_LightMap] && !fd.features[MFT_SubSurface] ) meta->addStatement( new GenOp( " @;\r\n", assignColor( new GenOp( "vec4(@, 1.0)", d_lightcolor ), Material::Mul ) ) ); @@ -603,9 +581,10 @@ void DeferredSubSurfaceGLSL::processPix( Vector &componentLis Var *d_NL_Att = (Var*)LangElement::find( "d_NL_Att" ); MultiLine *meta = new MultiLine; + Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); if (fd.features[MFT_isDeferred]) { - Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); + targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); meta->addStatement(new GenOp(" @.rgb += @.rgb*@.a;\r\n", targ, subSurfaceParams, subSurfaceParams)); output = meta; return; diff --git a/Engine/source/lighting/advanced/glsl/gBufferConditionerGLSL.cpp b/Engine/source/lighting/advanced/glsl/gBufferConditionerGLSL.cpp index 44d13d313..38a39ba9a 100644 --- a/Engine/source/lighting/advanced/glsl/gBufferConditionerGLSL.cpp +++ b/Engine/source/lighting/advanced/glsl/gBufferConditionerGLSL.cpp @@ -171,19 +171,7 @@ void GBufferConditionerGLSL::processPix( Vector &componentLis alphaVal = new Var( "outAlpha", "float" ); meta->addStatement( new GenOp( " @ = OUT_col1.a; // MFT_IsTranslucentZWrite\r\n", new DecOp( alphaVal ) ) ); } - - // If using interlaced normals, invert the normal - if(fd.features[MFT_InterlacedDeferred]) - { - // NOTE: Its safe to not call ShaderFeatureGLSL::addOutVpos() in the vertex - // shader as for SM 3.0 nothing is needed there. - Var *Vpos = (Var*) LangElement::find( "gl_Position" ); //Var *Vpos = ShaderFeatureGLSL::getInVpos( meta, componentList ); - - Var *iGBNormal = new Var( "interlacedGBNormal", "float3" ); - meta->addStatement(new GenOp(" @ = (frac(@.y * 0.5) < 0.1 ? reflect(@, float3(0.0, -1.0, 0.0)) : @);\r\n", new DecOp(iGBNormal), Vpos, gbNormal, gbNormal)); - gbNormal = iGBNormal; - } - + // NOTE: We renormalize the normal here as they // will not stay normalized during interpolation. meta->addStatement( new GenOp(" @ = @;", outputDecl, new GenOp( "float4(normalize(@), @)", gbNormal, depth ) ) ); diff --git a/Engine/source/lighting/advanced/hlsl/advancedLightingFeaturesHLSL.cpp b/Engine/source/lighting/advanced/hlsl/advancedLightingFeaturesHLSL.cpp index 11718e3dd..bb3b41142 100644 --- a/Engine/source/lighting/advanced/hlsl/advancedLightingFeaturesHLSL.cpp +++ b/Engine/source/lighting/advanced/hlsl/advancedLightingFeaturesHLSL.cpp @@ -150,29 +150,7 @@ void DeferredRTLightingFeatHLSL::processPix( Vector &component String unconditionLightInfo = String::ToLower( AdvancedLightBinManager::smBufferName ) + "Uncondition"; meta->addStatement(new GenOp(avar(" %s(@.Sample(@, @), @, @, @);\r\n", unconditionLightInfo.c_str()), lightBufferTex, lightInfoBuffer, uvScene, d_lightcolor, d_NL_Att, d_specular)); - - // If this has an interlaced pre-pass, do averaging here - if( fd.features[MFT_InterlacedDeferred] ) - { - Var *oneOverTargetSize = (Var*) LangElement::find( "oneOverTargetSize" ); - if( !oneOverTargetSize ) - { - oneOverTargetSize = new Var; - oneOverTargetSize->setType( "float2" ); - oneOverTargetSize->setName( "oneOverTargetSize" ); - oneOverTargetSize->uniform = true; - oneOverTargetSize->constSortPos = cspPass; - } - - meta->addStatement( new GenOp( " float id_NL_Att, id_specular;\r\n float3 id_lightcolor;\r\n" ) ); - meta->addStatement(new GenOp(avar(" %s(@.Sample(@, @ + float2(0.0, @.y)), id_lightcolor, id_NL_Att, id_specular);\r\n", - unconditionLightInfo.c_str()), lightBufferTex, lightInfoBuffer, uvScene, oneOverTargetSize)); - - meta->addStatement( new GenOp(" @ = lerp(@, id_lightcolor, 0.5);\r\n", d_lightcolor, d_lightcolor ) ); - meta->addStatement( new GenOp(" @ = lerp(@, id_NL_Att, 0.5);\r\n", d_NL_Att, d_NL_Att ) ); - meta->addStatement( new GenOp(" @ = lerp(@, id_specular, 0.5);\r\n", d_specular, d_specular ) ); - } - + // This is kind of weak sauce if( !fd.features[MFT_VertLit] && !fd.features[MFT_ToneMap] && !fd.features[MFT_LightMap] && !fd.features[MFT_SubSurface] ) meta->addStatement( new GenOp( " @;\r\n", assignColor( new GenOp( "float4(@, 1.0)", d_lightcolor ), Material::Mul ) ) ); @@ -643,9 +621,10 @@ void DeferredSubSurfaceHLSL::processPix( Vector &componentLis Var *d_NL_Att = (Var*)LangElement::find( "d_NL_Att" ); MultiLine *meta = new MultiLine; + Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); if (fd.features[MFT_isDeferred]) { - Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); + targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::RenderTarget3)); meta->addStatement(new GenOp(" @.rgb += @.rgb*@.a;\r\n", targ, subSurfaceParams, subSurfaceParams)); output = meta; return; diff --git a/Engine/source/lighting/advanced/hlsl/gBufferConditionerHLSL.cpp b/Engine/source/lighting/advanced/hlsl/gBufferConditionerHLSL.cpp index d4d14203f..e7daa3887 100644 --- a/Engine/source/lighting/advanced/hlsl/gBufferConditionerHLSL.cpp +++ b/Engine/source/lighting/advanced/hlsl/gBufferConditionerHLSL.cpp @@ -166,23 +166,17 @@ void GBufferConditionerHLSL::processPix( Vector &componentLis // to steal away the alpha channel before the // conditioner stomps on it. Var *alphaVal = NULL; + + Var* targ = (Var*)LangElement::find(getOutputTargetVarName(DefaultTarget)); + if (fd.features[MFT_isDeferred]) + targ = (Var*)LangElement::find(getOutputTargetVarName(RenderTarget1)); + if ( fd.features[ MFT_IsTranslucentZWrite ] ) { alphaVal = new Var( "outAlpha", "float" ); - meta->addStatement( new GenOp( " @ = OUT.col1.a; // MFT_IsTranslucentZWrite\r\n", new DecOp( alphaVal ) ) ); + meta->addStatement( new GenOp( " @ = @.a; // MFT_IsTranslucentZWrite\r\n", new DecOp( alphaVal ), targ) ); } - // If using interlaced normals, invert the normal - if(fd.features[MFT_InterlacedDeferred]) - { - // NOTE: Its safe to not call ShaderFeatureHLSL::addOutVpos() in the vertex - // shader as for SM 3.0 nothing is needed there. - Var *Vpos = ShaderFeatureHLSL::getInVpos( meta, componentList ); - - Var *iGBNormal = new Var( "interlacedGBNormal", "float3" ); - meta->addStatement(new GenOp(" @ = (frac(@.y * 0.5) < 0.1 ? reflect(@, float3(0.0, -1.0, 0.0)) : @);\r\n", new DecOp(iGBNormal), Vpos, gbNormal, gbNormal)); - gbNormal = iGBNormal; - } // NOTE: We renormalize the normal here as they // will not stay normalized during interpolation. @@ -192,8 +186,7 @@ void GBufferConditionerHLSL::processPix( Vector &componentLis // If we have an alpha var then we're doing deferred lerp blending. if ( alphaVal ) { - Var *outColor = (Var*)LangElement::find( getOutputTargetVarName( DefaultTarget ) ); - meta->addStatement( new GenOp( " @.ba = float2( 0, @ ); // MFT_IsTranslucentZWrite\r\n", outColor, alphaVal ) ); + meta->addStatement( new GenOp( " @.ba = float2( 0, @ ); // MFT_IsTranslucentZWrite\r\n", targ, alphaVal ) ); } output = meta; diff --git a/Engine/source/lighting/shadowMap/shadowMatHook.cpp b/Engine/source/lighting/shadowMap/shadowMatHook.cpp index 93850ba97..30f2db593 100644 --- a/Engine/source/lighting/shadowMap/shadowMatHook.cpp +++ b/Engine/source/lighting/shadowMap/shadowMatHook.cpp @@ -177,36 +177,53 @@ void ShadowMaterialHook::_overrideFeatures( ProcessedMaterial *mat, MaterialFeatureData &fd, const FeatureSet &features ) { - if ( stageNum != 0 ) + FeatureSet newFeatures; + + for (U32 i = 0; i < fd.features.getCount(); i++) { - fd.features.clear(); - return; + const FeatureType& type = fd.features.getAt(i); + if (type == MFT_AlphaTest || + type == MFT_TexAnim || + type == MFT_DiffuseMap || + type == MFT_IsTranslucent || + type == MFT_Visibility || + type == MFT_UseInstancing || + type == MFT_EyeSpaceDepthOut || + type == MFT_DeferredConditioner) + newFeatures.addFeature(type); + else if (type.getGroup() == MFG_PreTransform || + type.getGroup() == MFG_Transform || + type.getGroup() == MFG_PostTransform) + newFeatures.addFeature(type); } + // Disable the base texture if we don't // have alpha test enabled. - if ( !fd.features[ MFT_AlphaTest ] ) + if (!newFeatures[MFT_AlphaTest]) { - fd.features.removeFeature( MFT_TexAnim ); - fd.features.removeFeature( MFT_DiffuseMap ); + newFeatures.removeFeature(MFT_TexAnim); + newFeatures.removeFeature(MFT_DiffuseMap); } else - fd.features.removeFeature(MFT_IsTranslucent); + newFeatures.removeFeature(MFT_IsTranslucent); // HACK: Need to figure out how to enable these // suckers without this override call! - fd.features.setFeature( MFT_ParaboloidVertTransform, + newFeatures.setFeature( MFT_ParaboloidVertTransform, features.hasFeature( MFT_ParaboloidVertTransform ) ); - fd.features.setFeature( MFT_IsSinglePassParaboloid, + newFeatures.setFeature( MFT_IsSinglePassParaboloid, features.hasFeature( MFT_IsSinglePassParaboloid ) ); // The paraboloid transform outputs linear depth, so // it needs to use the plain depth out feature. - if ( fd.features.hasFeature( MFT_ParaboloidVertTransform ) ) - fd.features.addFeature( MFT_DepthOut ); + if (newFeatures.hasFeature( MFT_ParaboloidVertTransform ) ) + newFeatures.addFeature( MFT_DepthOut ); else - fd.features.addFeature( MFT_EyeSpaceDepthOut ); + newFeatures.addFeature( MFT_EyeSpaceDepthOut ); + + fd.features = newFeatures; } ShadowMatInstance::ShadowMatInstance( Material *mat ) diff --git a/Engine/source/renderInstance/renderDeferredMgr.cpp b/Engine/source/renderInstance/renderDeferredMgr.cpp index 502d254b6..e59de5d9a 100644 --- a/Engine/source/renderInstance/renderDeferredMgr.cpp +++ b/Engine/source/renderInstance/renderDeferredMgr.cpp @@ -594,6 +594,8 @@ void ProcessedDeferredMaterial::_determineFeatures( U32 stageNum, const FeatureSet &features ) { Parent::_determineFeatures( stageNum, fd, features ); + if (fd.features.hasFeature(MFT_ForwardShading)) + return; // Find this for use down below... bool bEnableMRTLightmap = false; @@ -676,7 +678,6 @@ void ProcessedDeferredMaterial::_determineFeatures( U32 stageNum, type == MFT_DetailNormalMap || type == MFT_AlphaTest || type == MFT_Parallax || - type == MFT_InterlacedDeferred || type == MFT_Visibility || type == MFT_UseInstancing || type == MFT_DiffuseVertColor || diff --git a/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp b/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp index 8d7856498..da55a7ed5 100644 --- a/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp +++ b/Engine/source/shaderGen/HLSL/shaderGenHLSLInit.cpp @@ -97,8 +97,6 @@ void _initShaderGenHLSL( ShaderGen *shaderGen ) FEATUREMGR->registerFeature( MFT_ParticleNormal, new ParticleNormalFeatureHLSL ); - FEATUREMGR->registerFeature( MFT_InterlacedDeferred, new NamedFeatureHLSL( "Interlaced Pre Pass" ) ); - FEATUREMGR->registerFeature( MFT_ForwardShading, new NamedFeatureHLSL( "Forward Shaded Material" ) ); FEATUREMGR->registerFeature( MFT_ImposterVert, new ImposterVertFeatureHLSL ); diff --git a/Engine/source/shaderGen/shaderFeature.cpp b/Engine/source/shaderGen/shaderFeature.cpp index 113b05a42..00bbd7c9d 100644 --- a/Engine/source/shaderGen/shaderFeature.cpp +++ b/Engine/source/shaderGen/shaderFeature.cpp @@ -65,6 +65,14 @@ const char* ShaderFeature::getOutputTargetVarName( OutputTarget target ) const case RenderTarget3: targName = "col3"; break; + + case RenderTarget4: + targName = "col4"; + break; + + case RenderTarget5: + targName = "col5"; + break; } return targName; @@ -89,4 +97,4 @@ Var* ShaderFeature::findOrCreateLocal( const char *name, void ShaderFeature::setInstancingFormat(GFXVertexFormat *format) { mInstancingFormat = format; -} \ No newline at end of file +} diff --git a/Engine/source/shaderGen/shaderFeature.h b/Engine/source/shaderGen/shaderFeature.h index a381caff5..6116151ce 100644 --- a/Engine/source/shaderGen/shaderFeature.h +++ b/Engine/source/shaderGen/shaderFeature.h @@ -87,6 +87,8 @@ public: RenderTarget1 = 1 << 1, RenderTarget2 = 1 << 2, RenderTarget3 = 1 << 3, + RenderTarget4 = 1 << 4, + RenderTarget5 = 1 << 5, }; protected: