第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(); }
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
//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 { } } } }
//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
#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(); }
//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
//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
//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