14.Compositor

终于到了合成器框架~对合成器我的理解就是一个针对某个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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值