void GBufferConditionerGLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { // sanity AssertFatal( fd.features[MFT_EyeSpaceDepthOut], "No depth-out feature enabled! Bad news!" ); MultiLine *meta = new MultiLine; // grab connector normal ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); Var *gbNormal = (Var*) LangElement::find( "gbNormal" ); if( !gbNormal ) { gbNormal = connectComp->getElement( RT_TEXCOORD ); gbNormal->setName( "gbNormal" ); gbNormal->setType( "vec3" ); gbNormal->mapsToSampler = false; gbNormal->uniform = false; } // find depth ShaderFeature *depthFeat = FEATUREMGR->getByType( MFT_EyeSpaceDepthOut ); AssertFatal( depthFeat != NULL, "No eye space depth feature found!" ); Var *depth = (Var*) LangElement::find(depthFeat->getOutputVarName()); AssertFatal( depth, "Something went bad with ShaderGen. The depth should be already generated by the EyeSpaceDepthOut feature." ); Var *unconditionedOut = new Var; unconditionedOut->setType("vec4"); unconditionedOut->setName("normal_depth"); LangElement *outputDecl = new DecOp( unconditionedOut ); // NOTE: We renormalize the normal here as they // will not stay normalized during interpolation. meta->addStatement( new GenOp(" @ = @;", outputDecl, new GenOp( "vec4(normalize(@), @)", gbNormal, depth ) ) ); meta->addStatement( assignOutput( unconditionedOut ) ); output = meta; }
void GBufferConditionerGLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { // sanity AssertFatal( fd.features[MFT_EyeSpaceDepthOut], "No depth-out feature enabled! Bad news!" ); MultiLine *meta = new MultiLine; // grab connector normal ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); Var *gbNormal = (Var*) LangElement::find( "gbNormal" ); if( !gbNormal ) { gbNormal = connectComp->getElement( RT_TEXCOORD ); gbNormal->setName( "gbNormal" ); gbNormal->setStructName( "IN" ); gbNormal->setType( "float3" ); gbNormal->mapsToSampler = false; gbNormal->uniform = false; } // find depth ShaderFeature *depthFeat = FEATUREMGR->getByType( MFT_EyeSpaceDepthOut ); AssertFatal( depthFeat != NULL, "No eye space depth feature found!" ); Var *depth = (Var*) LangElement::find(depthFeat->getOutputVarName()); AssertFatal( depth, "Something went bad with ShaderGen. The depth should be already generated by the EyeSpaceDepthOut feature." ); Var *unconditionedOut = new Var; unconditionedOut->setType("float4"); unconditionedOut->setName("normal_depth"); LangElement *outputDecl = new DecOp( unconditionedOut ); // If we're doing prepass blending then we need // to steal away the alpha channel before the // conditioner stomps on it. Var *alphaVal = NULL; if ( fd.features[ MFT_IsTranslucentZWrite ] ) { alphaVal = new Var( "outAlpha", "float" ); meta->addStatement( new GenOp( " @ = col.a; // MFT_IsTranslucentZWrite\r\n", new DecOp( alphaVal ) ) ); } // If using interlaced normals, invert the normal if(fd.features[MFT_InterlacedPrePass]) { // 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 ) ) ); meta->addStatement( assignOutput( unconditionedOut ) ); // If we have an alpha var then we're doing prepass lerp blending. if ( alphaVal ) { Var *outColor = (Var*)LangElement::find( getOutputTargetVarName( DefaultTarget ) ); meta->addStatement( new GenOp( " @.ba = float2( 0, @ ); // MFT_IsTranslucentZWrite\r\n", outColor, alphaVal ) ); } output = meta; }