示例#1
0
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
            }
        }
示例#3
0
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");
	}
}
示例#4
0
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();
		}*/
	}
}
示例#5
0
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);
}
示例#6
0
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);
	}
}
示例#7
0
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();
		//}
	}*/
}