void HDRCompositor::FinalRendering(void) { CompositionTargetPass *tp = m_HDRTechnique->getOutputTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); CompositionPass *pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); if(m_ToneMapper == TM_NONE || m_DebugRendertarget) pass->setMaterialName("CompositorCopyback"); else if(m_ToneMapper == TM_LINEAR) pass->setMaterialName("HDRFinalLinear"); else if(m_ToneMapper == TM_REINHARDS) pass->setMaterialName("HDRFinalReinh"); else if(m_ToneMapper == TM_REINHARDSMOD) pass->setMaterialName("HDRFinalReinhMod"); else if(m_ToneMapper == TM_LOG) pass->setMaterialName("HDRFinalLog"); else if(m_ToneMapper == TM_ADAPTLOG) pass->setMaterialName("HDRFinalAdaptiveLog"); else if(m_ToneMapper == TM_REINHARDLOCAL) pass->setMaterialName("HDRFinalReinhLocal"); if(m_DebugRendertarget == 1) pass->setInput(0,"scenedown4"); else if(m_DebugRendertarget == 2) pass->setInput(0,"Lumscale1"); else if(m_DebugRendertarget == 3) pass->setInput(0,"Lumscale2"); else if(m_DebugRendertarget == 4) pass->setInput(0,"Lumscale4"); else if(m_DebugRendertarget == 5) pass->setInput(0,"scale0"); else if(m_DebugRendertarget == 6) pass->setInput(0,"scale1"); else if(m_DebugRendertarget == 7) pass->setInput(0,"scale2"); else if(m_DebugRendertarget == 8) pass->setInput(0,"scale6"); /*else if(m_DebugRendertarget == 2) pass->setInput(0,"Lum64"); else if(m_DebugRendertarget == 3) pass->setInput(0,"Lum16"); else if(m_DebugRendertarget == 4) pass->setInput(0,"Lum4"); else if(m_DebugRendertarget == 5) pass->setInput(0,"Luminance"); else if(m_DebugRendertarget == 6) pass->setInput(0,"Bright"); else if(m_DebugRendertarget == 7) pass->setInput(0,"Glare"); else if(m_DebugRendertarget == 8) pass->setInput(0,"Star");*/ else { pass->setInput(0,"Scene"); if(m_ToneMapper != TM_NONE) { if(m_ToneMapper == TM_REINHARDLOCAL) { pass->setInput(0, "Lumscale1"); pass->setInput(1,"Key"); if(m_GlareType != GT_NONE) pass->setInput(2,"Glare"); if(m_StarType != GT_NONE) pass->setInput(3,"Star"); pass->setInput(4, "LocalAdaptMap"); } else { if(m_LumAdaption) pass->setInput(1, "AdaptedLum"); else pass->setInput(1, "Luminance"); pass->setInput(2, "Key"); } } if(m_ToneMapper != TM_REINHARDLOCAL) { if(m_GlareType != GT_NONE) pass->setInput(3,"Glare"); if(m_StarType != GT_NONE) pass->setInput(4,"Star"); } } pass->setIdentifier(MID_FINAL); }
void _init(void) { CompositorPtr compositor = CompositorManager::getSingleton().create( _theType(), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); CompositionTechnique *t; CompositionTechnique::TextureDefinition *td; CompositionTargetPass *tp; CompositionPass *pass; t = compositor->createTechnique(); td = t->createTextureDefinition("scene"); td->width.viewport = 1; td->height.viewport = 1; td->format = PF_X8R8G8B8; td = t->createTextureDefinition("blur0"); td->width.viewport = 0.5; td->height.viewport = 0.5; td->format = PF_X8R8G8B8; td = t->createTextureDefinition("blur1"); td->width.viewport = 0.5; td->height.viewport = 0.5; td->format = PF_X8R8G8B8; tp = t->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_PREVIOUS); tp->setOutputName("scene"); tp = t->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("blur0"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("PostFilters/Floodlighting/DownSample"); pass->setInput(0, "scene"); tp = t->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("blur1"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("PostFilters/Floodlighting/BlurHorizontal"); pass->setInput(0, "blur0"); tp = t->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("blur1"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("PostFilters/Floodlighting/BlurVertical"); pass->setInput(0, "blur0"); tp = t->getOutputTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("PostFilters/Floodlighting/Blend"); pass->setInput(0, "scene"); pass->setInput(1, "blur1"); pass->setIdentifier(0xDEADBADE); mBlurAmount = 0.2f; mShineAmount = 0.3f; // receive default parameters from material script if (!pass->getMaterial().isNull()) { GpuProgramParametersSharedPtr parameters = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters(); #if OGRE_VERSION >= 0x010300 const GpuConstantDefinition* def; def = parameters->_findNamedConstantDefinition("blur_amount"); if (def) parameters->_readRawConstants(def->physicalIndex, 1, &mBlurAmount); def = parameters->_findNamedConstantDefinition("shine_amount"); if (def) parameters->_readRawConstants(def->physicalIndex, 1, &mShineAmount); #else GpuProgramParameters::RealConstantEntry* entry; entry = parameters->getNamedRealConstantEntry("blur_amount"); if (entry && entry->isSet) mBlurAmount = entry->val[0]; entry = parameters->getNamedRealConstantEntry("shine_amount"); if (entry && entry->isSet) mShineAmount = entry->val[0]; #endif } }
void HDRCompositor::BuildStar(void) { if(m_StarType == ST_PLUS) { CompositionTargetPass *tp; CompositionPass *pass; String strDstH, strDstV; String strSrcH = "Bright"; String strSrcV = "Bright"; for(int i=0; i<m_StarPasses; i++) { String strDstH = "StarH"; String strDstV = "StarV"; if(i < m_StarPasses-1 ) { strDstH += StringConverter::toString(i); strDstV += StringConverter::toString(i); } CreateTextureDef(strDstH,m_Window->getWidth()/4,m_Window->getHeight()/4,PF_A8R8G8B8); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName(strDstH); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur"); pass->setInput(0,strSrcH); pass->setIdentifier(MID_STARH); strSrcH = strDstH; CreateTextureDef(strDstV,m_Window->getWidth()/4,m_Window->getHeight()/4,PF_A8R8G8B8); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName(strDstV); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur"); pass->setInput(0,strSrcV); pass->setIdentifier(MID_STARV); strSrcV = strDstV; } CreateTextureDef("Star",m_Window->getWidth()/4,m_Window->getHeight()/4,PF_A8R8G8B8); //merge horizontal and vertical blur tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Star"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("Merge2"); pass->setInput(0,"StarH"); pass->setInput(1,"StarV"); } }
void HDRCompositor::BuildGlare(void) { if(m_GlareType == GT_BLUR) { CompositionTargetPass *tp; CompositionPass *pass; String strDst; String strSrc = "Bright"; for(int i=0; i<m_GlarePasses; i++) { String strDst = "Glare"; if(i < m_GlarePasses-1 ) strDst += StringConverter::toString(i); CreateTextureDef(strDst,m_Window->getWidth()/4,m_Window->getHeight()/4,PF_A8R8G8B8); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName(strDst); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur"); pass->setInput(0,strSrc); pass->setIdentifier(MID_GAUSSBLUR); strSrc = strDst; } //entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); //if(entry) //{ // entry->val[0] = 32.f/m_Window->getWidth(); // entry->val[1] = 32.f/m_Window->getHeight(); //} /*pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur_2"); pass->setInput(0,"Glare"); pass->setInput(1,"Bright2"); entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); if(entry) { entry->val[0] = 8.f/m_Window->getWidth(); entry->val[1] = 8.f/m_Window->getHeight(); } pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur_3"); pass->setInput(0,"Glare"); pass->setInput(1,"Bright4"); entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); if(entry) { entry->val[0] = 16.f/m_Window->getWidth(); entry->val[1] = 16.f/m_Window->getHeight(); } pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur_4"); pass->setInput(0,"Glare"); pass->setInput(1,"Bright2"); entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); if(entry) { entry->val[0] = 32.f/m_Window->getWidth(); entry->val[1] = 32.f/m_Window->getHeight(); }*/ } }
void HDRCompositor::BuildScales(void) { CompositionTargetPass *tp; CompositionPass *pass; //first build luminacepass scales CreateTextureDef("Lumscale1",m_Window->getWidth(),m_Window->getHeight(),PF_FLOAT16_RGB); CreateTextureDef("Lumscale2",m_Window->getWidth()/2,m_Window->getHeight()/2,PF_FLOAT16_RGB); CreateTextureDef("Lumscale4",m_Window->getWidth()/4,m_Window->getHeight()/4,PF_FLOAT16_RGB); CreateTextureDef("Lumscale8",m_Window->getWidth()/8,m_Window->getHeight()/8,PF_FLOAT16_RGB); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lumscale1"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("LuminanceScale"); pass->setInput(0,"Scene"); if(m_LumAdaption) pass->setInput(1, "AdaptedLum"); else pass->setInput(1, "Luminance"); pass->setInput(2, "Key"); pass->setIdentifier(MID_LUMSCALE1); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lumscale2"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("Down2"); pass->setInput(0,"Lumscale1"); pass->setIdentifier(MID_LUMSCALE2); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lumscale4"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("Down2"); pass->setInput(0,"Lumscale2"); pass->setIdentifier(MID_LUMSCALE4); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lumscale8"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("Down2"); pass->setInput(0,"Lumscale4"); pass->setIdentifier(MID_LUMSCALE8); //filter downsampled scenes, each filter scale is 1.6 times larger //starting with: float s = 1.f / 2.f / sqrt(2.f); //sample scales 1, 2, 2, 4, 4, 8, 8 and build a total of 7 scales for(int i = 0; i < m_Scales; i++) { String strScale = "scale"; strScale += StringConverter::toString(i+1); int scaleSize = (1 << ((i + 1) / 2)); String strLumScale = "Lumscale"; strLumScale += StringConverter::toString(scaleSize); CreateTextureDef(strScale, m_Window->getWidth()/scaleSize, m_Window->getHeight()/scaleSize, PF_FLOAT16_RGB); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName(strScale); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("GaussBlur"); pass->setInput(0,strLumScale); pass->setIdentifier(MID_SCALE + i); } //build local adapt map CreateTextureDef("LocalAdaptMap", m_Window->getWidth(), m_Window->getHeight(), PF_FLOAT16_RGB); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("LocalAdaptMap"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("BuildLocalAdaptMap"); pass->setInput(0,"Key"); pass->setInput(1,"scale1"); pass->setInput(2,"scale2"); pass->setInput(3,"scale3"); pass->setInput(4,"scale4"); pass->setInput(5,"scale5"); pass->setInput(6,"scale6"); pass->setInput(7,"scale7"); pass->setIdentifier(MID_BUILDLOCAL); }
void HDRCompositor::CalculateLuminance(void) { CreateTextureDef("Lum64",64,64,PF_FLOAT16_R); CreateTextureDef("Lum16",16,16,PF_FLOAT16_R); CreateTextureDef("Lum4",4,4,PF_FLOAT16_R); CreateTextureDef("Luminance",1,1,PF_FLOAT16_R); CompositionTargetPass *tp; CompositionPass *pass; //intial to 64 tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lum64"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("LuminanceInitial"); pass->setInput(0,"scenedown4"); //down to 16 tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lum16"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("Luminance1"); pass->setInput(0,"Lum64"); //down to 4 tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Lum4"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("Luminance2"); pass->setInput(0,"Lum64"); //final to 1 tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Luminance"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); //if(m_ToneMapper != TM_ADAPTLOG) pass->setMaterialName("LuminanceFinalAvg"); //else // pass->setMaterialName("LuminanceFinalMax"); pass->setInput(0,"Lum4"); if(m_LumAdaption) { CreateTextureDef("AdaptedLumLast",1,1,PF_FLOAT16_R); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("AdaptedLumLast"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("CopyHDR"); pass->setInput(0,"AdaptedLum"); CreateTextureDef("AdaptedLum",1,1,PF_FLOAT16_R); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("AdaptedLum"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("AdaptLuminance"); pass->setInput(0,"Luminance"); pass->setInput(1,"AdaptedLumLast");//old pass->setIdentifier(MID_ADAPT); } }
void HDRCompositor::BrightPass(void) { CompositionTargetPass* tp; CompositionPass* pass; //first do brightpass CreateTextureDef("Bright",m_Window->getWidth()/4,m_Window->getHeight()/4,PF_A8R8G8B8); tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Bright"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("BrightPass"); pass->setInput(0,"scenedown4"); pass->setInput(1,"Luminance"); pass->setInput(2,"Key"); pass->setIdentifier(MID_BRIGHT); /*GpuProgramParameters::RealConstantEntry* entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("g_fMiddleGray"); if(entry) entry->val[0] = m_Key;*/ //downsamples of bright for glare and/or star /*if(m_GlareType != GT_NONE || m_StarType != ST_NONE) { CreateTextureDef("Bright2",m_Window->getWidth()/8,m_Window->getHeight()/8,PF_A8R8G8B8); //CreateTextureDef("Bright4",m_Window->getWidth()/16,m_Window->getHeight()/16,PF_A8R8G8B8); //CreateTextureDef("Bright8",m_Window->getWidth()/32,m_Window->getHeight()/32,PF_A8R8G8B8); //birght/2 tp = m_HDRTechnique->createTargetPass(); tp->setInputMode(CompositionTargetPass::IM_NONE); tp->setOutputName("Bright2"); pass = tp->createPass(); pass->setType(CompositionPass::PT_RENDERQUAD); pass->setMaterialName("BrightDown_1"); pass->setInput(0,"Bright"); entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); if(entry) { entry->val[0] = 4.f/m_Window->getWidth(); entry->val[1] = 4.f/m_Window->getHeight(); } //birght/4 //tp = m_HDRTechnique->createTargetPass(); //tp->setInputMode(CompositionTargetPass::IM_NONE); //tp->setOutputName("Bright4"); //pass = tp->createPass(); //pass->setType(CompositionPass::PT_RENDERQUAD); //pass->setMaterialName("BrightDown_2"); //pass->setInput(0,"Bright2"); //entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); //if(entry) //{ // entry->val[0] = 8.f/m_Window->getWidth(); // entry->val[1] = 8.f/m_Window->getHeight(); //} //birght/8 //tp = m_HDRTechnique->createTargetPass(); //tp->setInputMode(CompositionTargetPass::IM_NONE); //tp->setOutputName("Bright8"); //pass = tp->createPass(); //pass->setType(CompositionPass::PT_RENDERQUAD); //pass->setMaterialName("BrightDown_3"); //pass->setInput(0,"Bright4"); //entry = pass->getMaterial()->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->getNamedRealConstantEntry("rcpScreenSize"); //if(entry) //{ // entry->val[0] = 16.f/m_Window->getWidth(); // entry->val[1] = 16.f/m_Window->getHeight(); //} }*/ }