Quellcode durchsuchen

Merge pull request #271 from Azaezel/alpha40_shaderGenCleanups

Alpha40 shader gen cleanups
Brian Roberts vor 5 Jahren
Ursprung
Commit
cc5359fdfd

+ 3 - 24
Engine/source/lighting/advanced/glsl/advancedLightingFeaturesGLSL.cpp

@@ -142,29 +142,7 @@ void DeferredRTLightingFeatGLSL::processPix( Vector<ShaderComponent*> &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<ShaderComponent*> &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;

+ 1 - 13
Engine/source/lighting/advanced/glsl/gBufferConditionerGLSL.cpp

@@ -171,19 +171,7 @@ void GBufferConditionerGLSL::processPix(  Vector<ShaderComponent*> &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 ) ) );

+ 3 - 24
Engine/source/lighting/advanced/hlsl/advancedLightingFeaturesHLSL.cpp

@@ -150,29 +150,7 @@ void DeferredRTLightingFeatHLSL::processPix( Vector<ShaderComponent*> &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<ShaderComponent*> &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;

+ 7 - 14
Engine/source/lighting/advanced/hlsl/gBufferConditionerHLSL.cpp

@@ -166,23 +166,17 @@ void GBufferConditionerHLSL::processPix(  Vector<ShaderComponent*> &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<ShaderComponent*> &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;

+ 29 - 12
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 ) 

+ 2 - 1
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 ||

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

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

+ 2 - 0
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: