第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