mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-07-13 23:54:35 +00:00
Merge pull request #271 from Azaezel/alpha40_shaderGenCleanups
Alpha40 shader gen cleanups
This commit is contained in:
commit
cc5359fdfd
9 changed files with 56 additions and 91 deletions
|
|
@ -143,28 +143,6 @@ void DeferredRTLightingFeatGLSL::processPix( Vector<ShaderComponent*> &component
|
||||||
meta->addStatement( new GenOp( avar( " %s(tex2D(@, @), @, @, @);\r\n",
|
meta->addStatement( new GenOp( avar( " %s(tex2D(@, @), @, @, @);\r\n",
|
||||||
unconditionLightInfo.c_str() ), lightInfoBuffer, uvScene, d_lightcolor, d_NL_Att, d_specular ) );
|
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
|
// This is kind of weak sauce
|
||||||
if( !fd.features[MFT_VertLit] && !fd.features[MFT_ToneMap] && !fd.features[MFT_LightMap] && !fd.features[MFT_SubSurface] )
|
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 ) ) );
|
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" );
|
Var *d_NL_Att = (Var*)LangElement::find( "d_NL_Att" );
|
||||||
|
|
||||||
MultiLine *meta = new MultiLine;
|
MultiLine *meta = new MultiLine;
|
||||||
|
Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
|
||||||
if (fd.features[MFT_isDeferred])
|
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));
|
meta->addStatement(new GenOp(" @.rgb += @.rgb*@.a;\r\n", targ, subSurfaceParams, subSurfaceParams));
|
||||||
output = meta;
|
output = meta;
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -172,18 +172,6 @@ void GBufferConditionerGLSL::processPix( Vector<ShaderComponent*> &componentLis
|
||||||
meta->addStatement( new GenOp( " @ = OUT_col1.a; // MFT_IsTranslucentZWrite\r\n", new DecOp( alphaVal ) ) );
|
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
|
// NOTE: We renormalize the normal here as they
|
||||||
// will not stay normalized during interpolation.
|
// will not stay normalized during interpolation.
|
||||||
meta->addStatement( new GenOp(" @ = @;", outputDecl, new GenOp( "float4(normalize(@), @)", gbNormal, depth ) ) );
|
meta->addStatement( new GenOp(" @ = @;", outputDecl, new GenOp( "float4(normalize(@), @)", gbNormal, depth ) ) );
|
||||||
|
|
|
||||||
|
|
@ -151,28 +151,6 @@ void DeferredRTLightingFeatHLSL::processPix( Vector<ShaderComponent*> &component
|
||||||
meta->addStatement(new GenOp(avar(" %s(@.Sample(@, @), @, @, @);\r\n",
|
meta->addStatement(new GenOp(avar(" %s(@.Sample(@, @), @, @, @);\r\n",
|
||||||
unconditionLightInfo.c_str()), lightBufferTex, lightInfoBuffer, uvScene, d_lightcolor, d_NL_Att, d_specular));
|
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
|
// This is kind of weak sauce
|
||||||
if( !fd.features[MFT_VertLit] && !fd.features[MFT_ToneMap] && !fd.features[MFT_LightMap] && !fd.features[MFT_SubSurface] )
|
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 ) ) );
|
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" );
|
Var *d_NL_Att = (Var*)LangElement::find( "d_NL_Att" );
|
||||||
|
|
||||||
MultiLine *meta = new MultiLine;
|
MultiLine *meta = new MultiLine;
|
||||||
|
Var* targ = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget));
|
||||||
if (fd.features[MFT_isDeferred])
|
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));
|
meta->addStatement(new GenOp(" @.rgb += @.rgb*@.a;\r\n", targ, subSurfaceParams, subSurfaceParams));
|
||||||
output = meta;
|
output = meta;
|
||||||
return;
|
return;
|
||||||
|
|
|
||||||
|
|
@ -166,23 +166,17 @@ void GBufferConditionerHLSL::processPix( Vector<ShaderComponent*> &componentLis
|
||||||
// to steal away the alpha channel before the
|
// to steal away the alpha channel before the
|
||||||
// conditioner stomps on it.
|
// conditioner stomps on it.
|
||||||
Var *alphaVal = NULL;
|
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 ] )
|
if ( fd.features[ MFT_IsTranslucentZWrite ] )
|
||||||
{
|
{
|
||||||
alphaVal = new Var( "outAlpha", "float" );
|
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
|
// NOTE: We renormalize the normal here as they
|
||||||
// will not stay normalized during interpolation.
|
// 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 we have an alpha var then we're doing deferred lerp blending.
|
||||||
if ( alphaVal )
|
if ( alphaVal )
|
||||||
{
|
{
|
||||||
Var *outColor = (Var*)LangElement::find( getOutputTargetVarName( DefaultTarget ) );
|
meta->addStatement( new GenOp( " @.ba = float2( 0, @ ); // MFT_IsTranslucentZWrite\r\n", targ, alphaVal ) );
|
||||||
meta->addStatement( new GenOp( " @.ba = float2( 0, @ ); // MFT_IsTranslucentZWrite\r\n", outColor, alphaVal ) );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
output = meta;
|
output = meta;
|
||||||
|
|
|
||||||
|
|
@ -177,36 +177,53 @@ void ShadowMaterialHook::_overrideFeatures( ProcessedMaterial *mat,
|
||||||
MaterialFeatureData &fd,
|
MaterialFeatureData &fd,
|
||||||
const FeatureSet &features )
|
const FeatureSet &features )
|
||||||
{
|
{
|
||||||
if ( stageNum != 0 )
|
FeatureSet newFeatures;
|
||||||
|
|
||||||
|
for (U32 i = 0; i < fd.features.getCount(); i++)
|
||||||
{
|
{
|
||||||
fd.features.clear();
|
const FeatureType& type = fd.features.getAt(i);
|
||||||
return;
|
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
|
// Disable the base texture if we don't
|
||||||
// have alpha test enabled.
|
// have alpha test enabled.
|
||||||
if ( !fd.features[ MFT_AlphaTest ] )
|
if (!newFeatures[MFT_AlphaTest])
|
||||||
{
|
{
|
||||||
fd.features.removeFeature( MFT_TexAnim );
|
newFeatures.removeFeature(MFT_TexAnim);
|
||||||
fd.features.removeFeature( MFT_DiffuseMap );
|
newFeatures.removeFeature(MFT_DiffuseMap);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
fd.features.removeFeature(MFT_IsTranslucent);
|
newFeatures.removeFeature(MFT_IsTranslucent);
|
||||||
|
|
||||||
// HACK: Need to figure out how to enable these
|
// HACK: Need to figure out how to enable these
|
||||||
// suckers without this override call!
|
// suckers without this override call!
|
||||||
|
|
||||||
fd.features.setFeature( MFT_ParaboloidVertTransform,
|
newFeatures.setFeature( MFT_ParaboloidVertTransform,
|
||||||
features.hasFeature( MFT_ParaboloidVertTransform ) );
|
features.hasFeature( MFT_ParaboloidVertTransform ) );
|
||||||
fd.features.setFeature( MFT_IsSinglePassParaboloid,
|
newFeatures.setFeature( MFT_IsSinglePassParaboloid,
|
||||||
features.hasFeature( MFT_IsSinglePassParaboloid ) );
|
features.hasFeature( MFT_IsSinglePassParaboloid ) );
|
||||||
|
|
||||||
// The paraboloid transform outputs linear depth, so
|
// The paraboloid transform outputs linear depth, so
|
||||||
// it needs to use the plain depth out feature.
|
// it needs to use the plain depth out feature.
|
||||||
if ( fd.features.hasFeature( MFT_ParaboloidVertTransform ) )
|
if (newFeatures.hasFeature( MFT_ParaboloidVertTransform ) )
|
||||||
fd.features.addFeature( MFT_DepthOut );
|
newFeatures.addFeature( MFT_DepthOut );
|
||||||
else
|
else
|
||||||
fd.features.addFeature( MFT_EyeSpaceDepthOut );
|
newFeatures.addFeature( MFT_EyeSpaceDepthOut );
|
||||||
|
|
||||||
|
fd.features = newFeatures;
|
||||||
}
|
}
|
||||||
|
|
||||||
ShadowMatInstance::ShadowMatInstance( Material *mat )
|
ShadowMatInstance::ShadowMatInstance( Material *mat )
|
||||||
|
|
|
||||||
|
|
@ -594,6 +594,8 @@ void ProcessedDeferredMaterial::_determineFeatures( U32 stageNum,
|
||||||
const FeatureSet &features )
|
const FeatureSet &features )
|
||||||
{
|
{
|
||||||
Parent::_determineFeatures( stageNum, fd, features );
|
Parent::_determineFeatures( stageNum, fd, features );
|
||||||
|
if (fd.features.hasFeature(MFT_ForwardShading))
|
||||||
|
return;
|
||||||
|
|
||||||
// Find this for use down below...
|
// Find this for use down below...
|
||||||
bool bEnableMRTLightmap = false;
|
bool bEnableMRTLightmap = false;
|
||||||
|
|
@ -676,7 +678,6 @@ void ProcessedDeferredMaterial::_determineFeatures( U32 stageNum,
|
||||||
type == MFT_DetailNormalMap ||
|
type == MFT_DetailNormalMap ||
|
||||||
type == MFT_AlphaTest ||
|
type == MFT_AlphaTest ||
|
||||||
type == MFT_Parallax ||
|
type == MFT_Parallax ||
|
||||||
type == MFT_InterlacedDeferred ||
|
|
||||||
type == MFT_Visibility ||
|
type == MFT_Visibility ||
|
||||||
type == MFT_UseInstancing ||
|
type == MFT_UseInstancing ||
|
||||||
type == MFT_DiffuseVertColor ||
|
type == MFT_DiffuseVertColor ||
|
||||||
|
|
|
||||||
|
|
@ -97,8 +97,6 @@ void _initShaderGenHLSL( ShaderGen *shaderGen )
|
||||||
|
|
||||||
FEATUREMGR->registerFeature( MFT_ParticleNormal, new ParticleNormalFeatureHLSL );
|
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_ForwardShading, new NamedFeatureHLSL( "Forward Shaded Material" ) );
|
||||||
|
|
||||||
FEATUREMGR->registerFeature( MFT_ImposterVert, new ImposterVertFeatureHLSL );
|
FEATUREMGR->registerFeature( MFT_ImposterVert, new ImposterVertFeatureHLSL );
|
||||||
|
|
|
||||||
|
|
@ -65,6 +65,14 @@ const char* ShaderFeature::getOutputTargetVarName( OutputTarget target ) const
|
||||||
case RenderTarget3:
|
case RenderTarget3:
|
||||||
targName = "col3";
|
targName = "col3";
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case RenderTarget4:
|
||||||
|
targName = "col4";
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RenderTarget5:
|
||||||
|
targName = "col5";
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return targName;
|
return targName;
|
||||||
|
|
|
||||||
|
|
@ -87,6 +87,8 @@ public:
|
||||||
RenderTarget1 = 1 << 1,
|
RenderTarget1 = 1 << 1,
|
||||||
RenderTarget2 = 1 << 2,
|
RenderTarget2 = 1 << 2,
|
||||||
RenderTarget3 = 1 << 3,
|
RenderTarget3 = 1 << 3,
|
||||||
|
RenderTarget4 = 1 << 4,
|
||||||
|
RenderTarget5 = 1 << 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue