终于到了合成器框架~对合成器我的理解就是一个针对某个ViewPort的pixelShader......嗯
下面是一个合成器的例子:
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
}
}
}
}
说到底,合成器效果主要还是看PixelShader~下面直接上最后一个例子的代码吧~用到了CompositorListener,使得可以修改PXShader中的参数。假如加上FrameListener,就可以实时控制参数了,不过要注意此时应该使用notifyMaterialRender。
最后一个例子是分屏处理~
.CPP文件
#include "Ogre\ExampleApplication.h"
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));
}
};
class Example1:public ExampleApplication
{
public:
Example1()
{
compListener = NULL;
compListener2 = NULL;
compListener3 = NULL;
}
~Example1()
{
delete compListener;
delete compListener2;
delete compListener3;
}
void createScene()
{
Ogre::SceneNode* node = mSceneMgr ->getRootSceneNode() ->createChildSceneNode();
Ogre::Entity* ent = mSceneMgr ->createEntity("Sinbad.mesh");
node ->attachObject(ent);
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);
}
void createCamera()
{
mCamera = mSceneMgr ->createCamera("MyCamera1");
mCamera ->setPosition(0, 10, 20);
mCamera ->lookAt(0, 0, 0);
mCamera ->setNearClipDistance(5);
}
void createViewports()
{
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));
mCamera ->setAspectRatio(Real(vp ->getActualWidth()) / Real(vp ->getActualHeight()));
}
private:
Ogre::Camera* mCamera2;
Ogre::Viewport* vp;
Ogre::Viewport* vp2;
Ogre::Viewport* vp3;
Ogre::Viewport* vp4;
CompositorListener2* compListener;
CompositorListener3* compListener2;
CompositorListener4* compListener3;
};
int main(void)
{
Example1 app;
app.go();
}
.material文件
fragment_program MyFragmentShader10 cg
{
source 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
{
texture_unit
{
}
fragment_program_ref MyFragmentShader10
{
}
}
}
}
.compositor
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
}
}
}
}
.cg
void MyFragmentShader10(float2 uv : TEXCOORD0,
out float4 color : COLOR,
uniform sampler2D texture,
uniform float4 factors)
{
color = tex2D(texture, uv);
color *= factors;
}