void TerrainBaseMapFeatGLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { // grab connector texcoord register Var *texCoord = getInTexCoord( "texCoord", "vec3", true, componentList ); // We do nothing more if this is a prepass. if ( fd.features.hasFeature( MFT_PrePassConditioner ) ) return; // create texture var Var *diffuseMap = new Var; diffuseMap->setType( "sampler2D" ); diffuseMap->setName( "baseTexMap" ); diffuseMap->uniform = true; diffuseMap->sampler = true; diffuseMap->constNum = Var::getTexUnitNum(); // used as texture unit num here MultiLine *meta = new MultiLine; Var *baseColor = new Var; baseColor->setType( "vec4" ); baseColor->setName( "baseColor" ); meta->addStatement( new GenOp( " @ = tex2D( @, @.xy );\r\n", new DecOp( baseColor ), diffuseMap, texCoord ) ); meta->addStatement( new GenOp( " @;\r\n", assignColor( baseColor, Material::Mul ) ) ); output = meta; }
void TerrainBaseMapFeatGLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { // grab connector texcoord register Var *texCoord = getInTexCoord( "texCoord", "vec3", true, componentList ); // create texture var Var *diffuseMap = new Var; diffuseMap->setType( "sampler2D" ); diffuseMap->setName( "baseTexMap" ); diffuseMap->uniform = true; diffuseMap->sampler = true; diffuseMap->constNum = Var::getTexUnitNum(); // used as texture unit num here MultiLine *meta = new MultiLine; Var *baseColor = new Var; baseColor->setType( "vec4" ); baseColor->setName( "baseColor" ); meta->addStatement( new GenOp( " @ = tex2D( @, @.xy );\r\n", new DecOp( baseColor ), diffuseMap, texCoord ) ); meta->addStatement(new GenOp(" @ = toLinear(@);\r\n", baseColor, baseColor)); ShaderFeature::OutputTarget target = ShaderFeature::DefaultTarget; if(fd.features.hasFeature(MFT_isDeferred)) { target= ShaderFeature::RenderTarget1; } meta->addStatement( new GenOp( " @;\r\n", assignColor( baseColor, Material::Mul,NULL,target ) ) ); output = meta; }
template<typename ElemType> cv::Mat visualizeRegionLabel4MultiType(const cv::Mat& label,size_t region_num){ cv::Mat vis = cv::Mat::zeros(label.size(),CV_8UC3); if(region_num == 0){ return vis; } std::vector<cv::Vec3b> colors(region_num); for(size_t i=0;i<region_num;i++){ if(region_num<32){ colors[i] = assignColor(i); } else{ for(size_t c=0;c<3;c++){ colors[i][c] = rand() % UCHAR_MAX; } } // std::cerr << (int)colors[i][0] << ", " << (int)colors[i][1] << ", " << (int)colors[i][2] << std::endl; } for(int y=0;y<label.rows;y++){ for(int x=0;x<label.cols;x++){ ElemType l = label.at<ElemType>(y,x); if(l==0) continue; vis.at<cv::Vec3b>(y,x) = colors[l-1]; } } return vis; }
void EyeSpaceDepthOutHLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { MultiLine *meta = new MultiLine; // grab connector position ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); Var *wsEyeVec = connectComp->getElement( RT_TEXCOORD ); wsEyeVec->setName( "wsEyeVec" ); wsEyeVec->setStructName( "IN" ); wsEyeVec->setType( "float4" ); wsEyeVec->mapsToSampler = false; wsEyeVec->uniform = false; // get shader constants Var *vEye = new Var; vEye->setType("float3"); vEye->setName("vEye"); vEye->uniform = true; vEye->constSortPos = cspPass; // Expose the depth to the depth format feature Var *depthOut = new Var; depthOut->setType("float"); depthOut->setName(getOutputVarName()); LangElement *depthOutDecl = new DecOp( depthOut ); meta->addStatement( new GenOp( "#ifndef CUBE_SHADOW_MAP\r\n" ) ); if (fd.features.hasFeature(MFT_TerrainBaseMap)) meta->addStatement(new GenOp(" @ =min(0.9999, dot(@, (@.xyz / @.w)));\r\n", depthOutDecl, vEye, wsEyeVec, wsEyeVec)); else meta->addStatement(new GenOp(" @ = dot(@, (@.xyz / @.w));\r\n", depthOutDecl, vEye, wsEyeVec, wsEyeVec)); meta->addStatement( new GenOp( "#else\r\n" ) ); Var *farDist = (Var*)Var::find( "oneOverFarplane" ); if ( !farDist ) { farDist = new Var; farDist->setType("float4"); farDist->setName("oneOverFarplane"); farDist->uniform = true; farDist->constSortPos = cspPass; } meta->addStatement( new GenOp( " @ = length( @.xyz / @.w ) * @.x;\r\n", depthOutDecl, wsEyeVec, wsEyeVec, farDist ) ); meta->addStatement( new GenOp( "#endif\r\n" ) ); // If there isn't an output conditioner for the pre-pass, than just write // out the depth to rgba and return. if( !fd.features[MFT_PrePassConditioner] ) meta->addStatement( new GenOp( " @;\r\n", assignColor( new GenOp( "float4(@.rrr,1)", depthOut ), Material::None ) ) ); output = meta; }
void NormalsOutFeatGLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { MultiLine *meta = new MultiLine; output = meta; Var *wsNormal = (Var*)LangElement::find( "wsNormal" ); if ( !wsNormal ) { ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); wsNormal = connectComp->getElement( RT_TEXCOORD ); wsNormal->setName( "wsNormal" ); wsNormal->setStructName( "IN" ); wsNormal->setType( "vec3" ); // If we loaded the normal its our resposibility // to normalize it... the interpolators won't. // // Note we cast to half here to get partial precision // optimized code which is an acceptable loss of // precision for normals and performs much better // on older Geforce cards. // meta->addStatement( new GenOp( " @ = normalize( half3( @ ) );\r\n", wsNormal, wsNormal ) ); } LangElement *normalOut; Var *outColor = (Var*)LangElement::find( "col" ); if ( outColor && !fd.features[MFT_AlphaTest] ) normalOut = new GenOp( "float4( ( -@ + 1 ) * 0.5, @.a )", wsNormal, outColor ); else normalOut = new GenOp( "float4( ( -@ + 1 ) * 0.5, 1 )", wsNormal ); meta->addStatement( new GenOp( " @;\r\n", assignColor( normalOut, Material::None ) ) ); }
void DepthOutHLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); // grab connector position Var *depthVar = connectComp->getElement( RT_TEXCOORD ); depthVar->setName( "depth" ); depthVar->setStructName( "IN" ); depthVar->setType( "float" ); depthVar->mapsToSampler = false; depthVar->uniform = false; /* // Expose the depth to the depth format feature Var *depthOut = new Var; depthOut->setType("float"); depthOut->setName(getOutputVarName()); */ LangElement *depthOut = new GenOp( "float4( @, 0, 0, 1 )", depthVar ); output = new GenOp( " @;\r\n", assignColor( depthOut, Material::None ) ); }
void DeferredRTLightingFeatGLSL::processPix( Vector<ShaderComponent*> &componentList, const MaterialFeatureData &fd ) { // Skip deferred features, and use forward shading instead if ( fd.features[MFT_ForwardShading] ) { Parent::processPix( componentList, fd ); return; } MultiLine *meta = new MultiLine; ShaderConnector *connectComp = dynamic_cast<ShaderConnector *>( componentList[C_CONNECTOR] ); Var *ssPos = connectComp->getElement( RT_TEXCOORD ); ssPos->setName( "screenspacePos" ); ssPos->setStructName( "IN" ); ssPos->setType( "vec4" ); Var *uvScene = new Var; uvScene->setType( "vec2" ); uvScene->setName( "uvScene" ); LangElement *uvSceneDecl = new DecOp( uvScene ); String rtParamName = String::ToString( "rtParams%s", "lightInfoBuffer" ); Var *rtParams = (Var*) LangElement::find( rtParamName ); if( !rtParams ) { rtParams = new Var; rtParams->setType( "vec4" ); rtParams->setName( rtParamName ); rtParams->uniform = true; rtParams->constSortPos = cspPass; } meta->addStatement( new GenOp( " @ = @.xy / @.w;\r\n", uvSceneDecl, ssPos, ssPos ) ); // get the screen coord... its -1 to +1 meta->addStatement( new GenOp( " @ = ( @ + 1.0 ) / 2.0;\r\n", uvScene, uvScene ) ); // get the screen coord to 0 to 1 meta->addStatement( new GenOp( " @.y = 1.0 - @.y;\r\n", uvScene, uvScene ) ); // flip the y axis meta->addStatement( new GenOp( " @ = ( @ * @.zw ) + @.xy;\r\n", uvScene, uvScene, rtParams, rtParams) ); // scale it down and offset it to the rt size Var *lightInfoSamp = new Var; lightInfoSamp->setType( "vec4" ); lightInfoSamp->setName( "lightInfoSample" ); // create texture var Var *lightInfoBuffer = new Var; lightInfoBuffer->setType( "sampler2D" ); lightInfoBuffer->setName( "lightInfoBuffer" ); lightInfoBuffer->uniform = true; lightInfoBuffer->sampler = true; lightInfoBuffer->constNum = Var::getTexUnitNum(); // used as texture unit num here // Declare the RTLighting variables in this feature, they will either be assigned // in this feature, or in the tonemap/lightmap feature Var *d_lightcolor = new Var( "d_lightcolor", "vec3" ); meta->addStatement( new GenOp( " @;\r\n", new DecOp( d_lightcolor ) ) ); Var *d_NL_Att = new Var( "d_NL_Att", "float" ); meta->addStatement( new GenOp( " @;\r\n", new DecOp( d_NL_Att ) ) ); Var *d_specular = new Var( "d_specular", "float" ); meta->addStatement( new GenOp( " @;\r\n", new DecOp( d_specular ) ) ); // Perform the uncondition here. 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_InterlacedPrePass] ) { 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 float3 id_lightcolor;\r\n" ) ); meta->addStatement( new GenOp( avar( " %s(tex2D(@, @ + float2(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( "float4(@, 1.0)", d_lightcolor ), Material::Mul ) ) ); output = meta; }