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

来源:互联网 发布:和俄罗斯人谈恋爱 知乎 编辑:程序博客网 时间:2024/06/05 02:52

第1个例子


main.cpp文件

#include "ExampleApplication.h"//8 beginclass CompositorListener1:public Ogre::CompositorInstance::Listener{public://9 beginCompositorListener1(){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 beginvoid notifyMaterialRender(uint32 pass_id, MaterialPtr &mat){mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()->setNamedConstant("numpixels",number);}//9|8.1 end//9 beginvoid setNumber(float num){number=num;}float getNumber(){return number;}private:float number;//9 end};//8 end//9 beginclass 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 endclass Example1:public ExampleApplication{public://8 beginExample1(){compListener=NULL;//9 beginFrameListener=NULL;//9 end}~Example1(){if(compListener)delete compListener;//9 beginif(FrameListener)delete FrameListener;//9 end}//8 end//9 beginvoid createFrameListener(){FrameListener=new MyExampleFrameListener(mWindow,compListener);mRoot->addFrameListener(FrameListener);}//9 endvoid 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 beginOgre::CompositorManager::getSingleton().addCompositor(mCamera->getViewport(),"Compositor8");Ogre::CompositorManager::getSingleton().setCompositorEnabled(mCamera->getViewport(),"Compositor8",true);//7|6 end//8_7 beginOgre::CompositorInstance* comp=Ogre::CompositorManager::getSingleton().getCompositorChain(mCamera->getViewport())->getCompositor("Compositor8");compListener=new CompositorListener1();comp->addListener(compListener);//8_7 end}//8_7 beginprivate:CompositorListener1* compListener;//8_7 end//9_8 beginOgre::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 nonepass render_quad {material Ogre3DBeginnersGuide/Comp1input 0 scene}}}}compositor Compositor2{technique{texture scene   target_width target_height PF_R8G8B8//尼玛,纹理与target名字要一样!target scene{input previous}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp2input 0 scene}}}}compositor Compositor3{technique{texture scene target_width target_height PF_R8G8B8target scene{input previous}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp3input 0 scene}}}}compositor Compositor4{technique{texture scene target_width target_height PF_R8G8B8texture temp target_width target_height  PF_R8G8B8target scene{input previous}target temp{pass render_quad{material Ogre3DBeginnersGuide/Comp2input 0 scene}}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp3input 0 temp}}}}//5 begincompositor Compositor5{technique{texture scene target_width target_height PF_R8G8B8target scene{input previous}target scene{pass render_quad{material Ogre3DBeginnersGuide/Comp2input 0 scene}}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp3input 0 scene}}}}//5 end//6 begincompositor Compositor7/*注意跟程序里的大小写保持一致,另外注释不能加在Compositor7名字后面,否则注释解释为名字,包括//这种也不行*/{technique{texture scene target_width target_height PF_R8G8B8target scene{input previous}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp5input 0 scene}}}}//6 end//7 begincompositor Compositor8{technique{texture scene target_width target_height PF_R8G8B8target scene{input previous}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp6input 0 scene}}}}//7 end

Seamanj_Ogre3DBeginnersGuide.material文件

//chap8 beginmaterial Ogre3DBeginnersGuide/Comp1{technique{pass{texture_unit{}}}}fragment_program MyFragmentShader5 cg{source Seamanj_Ogre3DBeginnersGuideShaders.cgentry_point MyFragmentShader5profiles ps_1_1 arbfp1}material Ogre3DBeginnersGuide/Comp2{technique{pass{fragment_program_ref MyFragmentShader5{}texture_unit{}}}}fragment_program MyFragmentShader6 cg{source Seamanj_Ogre3DBeginnersGuideShaders.cgentry_point MyFragmentShader6profiles ps_1_1 arbfp1}material Ogre3DBeginnersGuide/Comp3{technique{pass{fragment_program_ref MyFragmentShader6{}texture_unit{}}}}fragment_program MyFragmentShader8 cg{source Seamanj_Ogre3DBeginnersGuideShaders.cgentry_point MyFragmentShader8profiles ps_2_0 arbfp1}material Ogre3DBeginnersGuide/Comp5{technique{pass{fragment_program_ref MyFragmentShader8{}texture_unit{}}}}fragment_program MyFragmentShader9 cg{source Seamanj_Ogre3DBeginnersGuideShaders.cgentry_point MyFragmentShader9profiles ps_2_0 arbfp1default_params{param_named numpixels float 25}}material Ogre3DBeginnersGuide/Comp6{technique{pass{fragment_program_ref MyFragmentShader9{}texture_unit{}}}}

Ogre3DBeginnersGuideShaders.cg 文件

//chap8:2 beginvoid 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 beginvoid 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 beginvoid 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 beginvoid 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 beginclass 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 endclass Example:public ExampleApplication{public://2 beginExample(){compListener=NULL;compListener2=NULL;compListener3=NULL;}~Example(){if(compListener){delete compListener;}if(compListener2){delete compListener2;}if(compListener3){delete compListener3;}}//2 endvoid createScene(){Ogre::SceneNode* node=mSceneMgr->getRootSceneNode()->createChildSceneNode();Ogre::Entity* ent=mSceneMgr->createEntity("Sinbad.mesh");node->attachObject(ent);//2 beginOgre::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 beginvoid 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 beginmCamera=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 beginvp=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 beginprivate://1.1 beginOgre::Camera* mCamera2;//1.1 end//2|1.1 beginOgre::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 begincompositor Compositor9{technique{texture scene target_width target_height PF_R8G8B8target scene{input previous}target_output{input nonepass render_quad{material Ogre3DBeginnersGuide/Comp7input 0 scene}}}}//chap8_part2:2 end

Seamanj_Ogre3DBeginnersGuide.material


//chap8_part2:2 beginfragment_program MyFragmentShader10 cg{source Seamanj_Ogre3DBeginnersGuideShaders.cgentry_point MyFragmentShader10profiles ps_2_0 arbfp1default_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 beignvoid MyFragmentShader10(float2 uv:TEXCOORD0,out float4 color:COLOR,uniform sampler2D texture,uniform float4 factors){color=tex2D(texture,uv);color*=factors;}//chap8_part2:2 end





原创粉丝点击