第八章 OGRE中合成器(也就是传说中的image-based rendering)以及如何在OGRE中对着色器的uniform变量传值

第1个例子


main.cpp文件

#include "ExampleApplication.h"
//8 begin
class CompositorListener1:public Ogre::CompositorInstance::Listener
{
public:
	//9 begin
	CompositorListener1()
	{
		number=25.0f;
	}
	//9 end
	//8.1 begin
/*
	void notifyMaterialSetup(uint32 pass_id, MaterialPtr &mat)//notifyMaterialSetup gets called only after the material has been created.but notifyMaterialRender gets called each time the material is going to be rendered.
	{
		mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()->setNamedConstant("numpixels",125.0f);

	}*/

	//8.1 end
	//9|8.1 begin
	void notifyMaterialRender(uint32 pass_id, MaterialPtr &mat)
	{
		mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()->setNamedConstant("numpixels",number);

	}
	//9|8.1 end
	//9 begin
	void setNumber(float num)
	{
		number=num;
	}
	float getNumber()
	{
		return number;
	}
private:
	float number;
	//9 end
};
//8 end
//9 begin
class MyExampleFrameListener:public Ogre::FrameListener
{
public:
	MyExampleFrameListener(RenderWindow* win,CompositorListener1* listener)
	{
		_listener=listener;
		size_t windowHnd=0;
		std::stringstream windowHndStr;
		win->getCustomAttribute("WINDOW",&windowHnd);
		windowHndStr<<windowHnd;
		OIS::ParamList pl;
		pl.insert(std::make_pair(std::string("WINDOW"),windowHndStr.str()));
		_man=OIS::InputManager::createInputSystem(pl);
		_key=static_cast<OIS::Keyboard*>(_man->createInputObject(OIS::OISKeyboard,false));
	}
	~MyExampleFrameListener()
	{
		_man->destroyInputObject(_key);
		OIS::InputManager::destroyInputSystem(_man);
	}
	bool frameStarted(const FrameEvent& evt)
	{
		_key->capture();
		if(_key->isKeyDown(OIS::KC_ESCAPE))
		{
			return false;
		}
		if(_key->isKeyDown(OIS::KC_UP))
		{
			float num=_listener->getNumber();
			num++;
			_listener->setNumber(num);

		}
		if(_key->isKeyDown(OIS::KC_DOWN))
		{
			float num=_listener->getNumber();
			num--;
			_listener->setNumber(num);
		}
		return true;
	}
private:
	OIS::InputManager* _man;
	OIS::Keyboard* _key;
	CompositorListener1* _listener;
};
//9 end
class Example1:public ExampleApplication
{
public:
	//8 begin
	Example1()
	{
		compListener=NULL;
		//9 begin
		FrameListener=NULL;
		//9 end
	}
	~Example1()
	{
		if(compListener)
			delete compListener;
		//9 begin
		if(FrameListener)
			delete FrameListener;
		//9 end
	}
	//8 end
	//9 begin
	void createFrameListener()
	{
		FrameListener=new MyExampleFrameListener(mWindow,compListener);
		mRoot->addFrameListener(FrameListener);
	}
	//9 end
	void createScene()
	{
		Ogre::SceneNode* node=mSceneMgr->getRootSceneNode()->createChildSceneNode("Node1",Ogre::Vector3(0,0,450));
		Ogre::Entity* ent=mSceneMgr->createEntity("Entity1","Sinbad.mesh");
		node->attachObject(ent);
		//1 begin
		/*
		Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor1");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor1",true);*/

		//1 end
		//2|1 begin
		/*
		Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor2");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor2",true);*/


		//2|1 end
		//3|2 begin
		/*
		Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor3");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor3",true);*/

		//3|2 end
		//4|3 begin
		/*
		Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor4");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor4",true);*/

		//4|3 end
		//5|4 begin
	//Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor5");
	//Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor5",true);

		//5|4 end
		//6|5 begin
/*
		Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor7");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor7",true);*/

		//6|5 end
		//7|6 begin
				Ogre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor8");
								Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor8",true);
		
		//7|6 end
		//8_7 begin
		Ogre::CompositorInstance* comp=Ogre::CompositorManager::getSingleton().getCompositorChain(mCamera->getViewport())->getCompositor("Compositor8");
		compListener=new CompositorListener1();
		comp->addListener(compListener);
		//8_7 end
	}
//8_7 begin
private:
	CompositorListener1* compListener;
//8_7 end
//9_8 begin
	Ogre::FrameListener* FrameListener;
//9_8 end
};
void main()
{
	Example1 app;
	app.go();
}


Seamanj_Ogre3DBeginnersGuide.compositor文件


compositor Compositor1
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		//将渲染后的图象渲染后纹理中,准备进一步操作
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
		 	{
				material Ogre3DBeginnersGuide/Comp1
				input 0 scene
			}
		}
	}
}
compositor Compositor2
{
	technique
	{
		texture scene   target_width target_height PF_R8G8B8
		//尼玛,纹理与target名字要一样!
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
			{
				
				material Ogre3DBeginnersGuide/Comp2
				input 0 scene
			}
		}
	}
}

compositor Compositor3
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
			{
				
				material Ogre3DBeginnersGuide/Comp3
				input 0 scene
			}
		}
	}
}



compositor Compositor4
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		texture temp target_width target_height  PF_R8G8B8
		target scene
		{
			input previous
		}
		target temp
		{
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp2
				input 0 scene
			}
		}
		target_output
		{
			input none
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp3
				input 0 temp
			}
		}
		
	}
}

//5 begin
compositor Compositor5
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		target scene
		{
			input previous
		}
		target scene
		{
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp2
				input 0 scene
			}
		}
		target_output
		{
			input none
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp3
				input 0 scene
			}
		}
	}
}
//5 end
//6 begin
compositor Compositor7
/*注意跟程序里的大小写保持一致,另外注释不能加在Compositor7名字后面,否则注释解释为名字,包括//这种也不行*/
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp5
				input 0 scene
			}
		}
	}
}
//6 end
//7 begin
compositor Compositor8
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp6
				input 0 scene
			}
		}
	}
}
//7 end

Seamanj_Ogre3DBeginnersGuide.material文件

//chap8 begin
material Ogre3DBeginnersGuide/Comp1
{
	technique
	{
		pass
		{
			texture_unit
			{

			}
		}
	}
}

fragment_program MyFragmentShader5 cg
{
	source Seamanj_Ogre3DBeginnersGuideShaders.cg
	entry_point MyFragmentShader5
	profiles ps_1_1 arbfp1
}


material Ogre3DBeginnersGuide/Comp2
{
	technique
	{
		pass
		{
			fragment_program_ref MyFragmentShader5
			{
				
			}
			texture_unit
			{
			
			}
		}
	}
}

fragment_program MyFragmentShader6 cg
{
	source Seamanj_Ogre3DBeginnersGuideShaders.cg
	entry_point MyFragmentShader6
	profiles ps_1_1 arbfp1
}


material Ogre3DBeginnersGuide/Comp3
{
	technique
	{
		pass
		{
			fragment_program_ref MyFragmentShader6
			{
				
			}
			texture_unit
			{
			
			}
		}
	}
}

fragment_program MyFragmentShader8 cg
{
	source Seamanj_Ogre3DBeginnersGuideShaders.cg
	entry_point MyFragmentShader8
	profiles ps_2_0 arbfp1
}

material Ogre3DBeginnersGuide/Comp5
{
	technique
	{
		pass
		{
			fragment_program_ref MyFragmentShader8
			{
				
			}
			texture_unit
			{
			
			}
		}
	}
}


fragment_program MyFragmentShader9 cg
{
	source Seamanj_Ogre3DBeginnersGuideShaders.cg
	entry_point MyFragmentShader9
	profiles ps_2_0 arbfp1
	default_params
	{
		param_named numpixels float 25
	}
}
material Ogre3DBeginnersGuide/Comp6
{
	technique
	{
		pass
		{
			fragment_program_ref MyFragmentShader9
			{
				
			}
			texture_unit
			{
			
			}
		}
	}
}

Ogre3DBeginnersGuideShaders.cg 文件

//chap8:2 begin
void MyFragmentShader5(float2 uv:TEXCOORD0,out float4 color:COLOR,uniform sampler2D texture)
{
	float4 temp_color=tex2D(texture,uv);
	float greyvalue=temp_color.r*0.3+temp_color.g*0.59+temp_color.b*0.11;
	color=float4(greyvalue,greyvalue,greyvalue,0);
}
//chap8:2 end


//chap8:3 begin
void MyFragmentShader6(float2 uv:TEXCOORD0,out float4 color:COLOR,uniform sampler2D texture)
{
	float4 temp_color=tex2D(texture,uv);
	color=float4(1.0-temp_color.r,1.0-temp_color.g,1.0-temp_color.b,0);
}
//chap3:3 end

//chap8:6 begin
void MyFragmentShader8(float2 uv:TEXCOORD0,out float4 color:COLOR,uniform sampler2D texture)
{
	float num=50;
	float stepsize=1.0/num;
	float2 fragment=float2(stepsize*floor(uv.x*num),stepsize*floor(uv.y*num));
	color=tex2D(texture,fragment);
	
}
//chap8:6 end
//chap8:7 begin
void MyFragmentShader9(float2 uv:TEXCOORD0,out float4 color:COLOR,uniform sampler2D texture,uniform float numpixels)
{
	float num=numpixels;
	float stepsize=1.0/num;
	float2 fragment=float2(stepsize*floor(uv.x*num),stepsize*floor(uv.y*num));
	color=tex2D(texture,fragment);
}
//chap8:7 end

第2个例子:添加分屏


#include "ExampleApplication.h"
//2 begin
class CompositorListener2:public Ogre::CompositorInstance::Listener
{
public:
	void notifyMaterialSetup(uint32 pass_id, MaterialPtr &mat)
	{
		mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()->setNamedConstant("factors",Ogre::Vector3(1,0,0));
	}
};
class CompositorListener3:public Ogre::CompositorInstance::Listener
{
public:
	void notifyMaterialSetup(uint32 pass_id, MaterialPtr &mat)
	{
		mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()->setNamedConstant("factors",Ogre::Vector3(0,1,0));
	}
};
class CompositorListener4:public Ogre::CompositorInstance::Listener
{
public:
	void notifyMaterialSetup(uint32 pass_id, MaterialPtr &mat)
	{
		mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()->setNamedConstant("factors",Ogre::Vector3(0,0,1));
	}
};
//2 end
class Example:public ExampleApplication
{
public:
	//2 begin
Example()
	{
		compListener=NULL;
		compListener2=NULL;
		compListener3=NULL;
	}
	~Example()
	{
		if(compListener)
		{
			delete compListener;
		}
		if(compListener2)
		{
			delete compListener2;
		}
		if(compListener3)
		{
			delete compListener3;
		}
	}
	//2 end
	void createScene()
	{
		Ogre::SceneNode* node=mSceneMgr->getRootSceneNode()->createChildSceneNode();
		Ogre::Entity* ent=mSceneMgr->createEntity("Sinbad.mesh");
		node->attachObject(ent);
		//2 begin
		Ogre::CompositorManager::getSingleton().addCompositor(vp,"Compositor9");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp,"Compositor9",true);
		Ogre::CompositorInstance* comp=Ogre::CompositorManager::getSingleton().getCompositorChain(vp)->getCompositor("Compositor9");
		compListener=new CompositorListener2();
		comp->addListener(compListener);

		Ogre::CompositorManager::getSingleton().addCompositor(vp2,"Compositor9");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp2,"Compositor9",true);
		Ogre::CompositorInstance* comp2=Ogre::CompositorManager::getSingleton().getCompositorChain(vp2)->getCompositor("Compositor9");
		compListener2=new CompositorListener3();
		comp2->addListener(compListener2);

		Ogre::CompositorManager::getSingleton().addCompositor(vp3,"Compositor9");
		Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp3,"Compositor9",true);
		Ogre::CompositorInstance* comp3=Ogre::CompositorManager::getSingleton().getCompositorChain(vp3)->getCompositor("Compositor9");
		compListener3=new CompositorListener4();
		comp3->addListener(compListener3);
		//2 end
	}
//1 begin
	
	void createCamera()
		{
			//1.2 begin
/*
			mCamera=mSceneMgr->createCamera("MyCamera1");
			mCamera->setPosition(0,10,20);
			mCamera->lookAt(0,0,0);
			mCamera->setNearClipDistance(5);
			mCamera2=mSceneMgr->createCamera("MyCamera2");
			mCamera2->setPosition(20,10,0);
			mCamera2->lookAt(0,0,0);
			mCamera2->setNearClipDistance(5);*/

			//1.2 end
			//2|1.2 begin
			mCamera=mSceneMgr->createCamera("MyCamera1");
			mCamera->setPosition(0,10,20);
			mCamera->lookAt(0,0,0);
			mCamera->setNearClipDistance(5);
			//2|1.2 end

		}
	
		void createViewports()
		{
			//1.3 begin
			/*
			Ogre::Viewport* vp=mWindow->addViewport(mCamera,0,0.0,0.0,0.5,1.0);
						vp->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));
						Ogre::Viewport* vp2=mWindow->addViewport(mCamera2,1,0.5,0.0,0.5,1.0);
						vp2->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));
						mCamera->setAspectRatio(Real(vp->getActualWidth())/Real(vp->getActualHeight()));
						mCamera2->setAspectRatio(Real(vp->getActualWidth())/Real(vp->getActualHeight()));*/
			
			//1.3 end
			//2|1.3 begin
			vp=mWindow->addViewport(mCamera,0,0.0,0.0,0.5,0.5);
			vp->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));
			vp2=mWindow->addViewport(mCamera,1,0.5,0.0,0.5,0.5);
			vp2->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));
			vp3=mWindow->addViewport(mCamera,2,0.0,0.5,0.5,0.5);
			vp3->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));
			vp4=mWindow->addViewport(mCamera,3,0.5,0.5,0.5,0.5);
			vp4->setBackgroundColour(ColourValue(0.0f,0.0f,0.0f));
			//2|1.3 end
		}
	
//1 end
//1 begin
private:
	//1.1 begin
	Ogre::Camera* mCamera2;
	//1.1 end
	//2|1.1 begin
	Ogre::Viewport* vp;
	Ogre::Viewport* vp2;
	Ogre::Viewport* vp3;
	Ogre::Viewport* vp4;
	CompositorListener2* compListener;
	CompositorListener3* compListener2;
	CompositorListener4* compListener3;
	//2|1.1 end
//1 end
};

void main()
{
	Example app;
	app.go();

}

Seamanj_Ogre3DBeginnersGuide.compositor

//chap8_part2:2 begin
compositor Compositor9
{
	technique
	{
		texture scene target_width target_height PF_R8G8B8
		target scene
		{
			input previous
		}
		target_output
		{
			input none
			pass render_quad
			{
				material Ogre3DBeginnersGuide/Comp7
				input 0 scene
			}
		}
	}
}
//chap8_part2:2 end

Seamanj_Ogre3DBeginnersGuide.material


//chap8_part2:2 begin
fragment_program MyFragmentShader10 cg
{
	source Seamanj_Ogre3DBeginnersGuideShaders.cg
	entry_point MyFragmentShader10
	profiles ps_2_0 arbfp1
	default_params
	{
		param_named factors float4 1 1 1 0
	}
}
material Ogre3DBeginnersGuide/Comp7
{
	technique
	{
		pass
		{
			fragment_program_ref MyFragmentShader10
			{
				
			}
			texture_unit
			{
			
			}
		}
	}
}
//chap8_part2:2 end

Ogre3DBeginnersGuideShaderscg

//chap8_part2:2 beign
void MyFragmentShader10(float2 uv:TEXCOORD0,out float4 color:COLOR,uniform sampler2D texture,uniform float4 factors)
{
	color=tex2D(texture,uv);
	color*=factors;
}
//chap8_part2:2 end





你可能感兴趣的:(第八章 OGRE中合成器(也就是传说中的image-based rendering)以及如何在OGRE中对着色器的uniform变量传值)