Ogre 20111205

ogre实现分屏渲染

 1 class MyApplication :public ExampleApplication
2 {
3 public:
4 MyApplication() {}
5 ~MyApplication()
6 {
7 }
8
9 void createCamera()
10 {
11 mCamera = mSceneMgr->createCamera("mycamera1");
12 mCamera->setPosition(Ogre::Vector3(0, 10, 20));
13 mCamera->lookAt(0, 0, 0);
14 mCamera->setNearClipDistance(5);
15
16 camera2_ = mSceneMgr->createCamera("mycamera2");
17 camera2_->setPosition(Ogre::Vector3(20, 10, 0));
18 camera2_->lookAt(0, 0, 0);
19 camera2_->setNearClipDistance(5);
20 }
21
22 void createViewports()
23 {
24 Ogre::Viewport* vp = mWindow->addViewport(mCamera, 0, 0.0, 0.0, 0.5, 1.0);
25 vp->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
26
27 Ogre::Viewport* vp2 = mWindow->addViewport(camera2_, 1, 0.5, 0.0, 0.5, 1.0);
28 vp2->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
29
30 mCamera->setAutoAspectRatio(Real(vp->getActualWidth() / vp->getActualHeight()));
31 camera2_->setAutoAspectRatio(Real(vp2->getActualWidth() / vp2->getActualHeight()));
32 }
33
34 void createScene()
35 {
36 Ogre::Entity* ent = mSceneMgr->createEntity("entity1", "Sinbad.mesh");
37 Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("node1");
38 node->attachObject(ent);
39 }
40
41 private:
42 Ogre::Camera* camera2_;
43 };

合成器+分屏的example

将屏幕分成四个viewport,对其中三个viewport添加合成器,并对每个合成器添加监听器,在合成器的监听器里面改变

fragment_program shader脚本的参数实现改变渲染效果。

  1 class CompositorListener1 : public Ogre::CompositorInstance::Listener
2 {
3 public:
4 void notifyMaterialSetup(uint32 pass_id, MaterialPtr& mat)
5 {
6 mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()
7 ->setNamedConstant("factors", Ogre::Vector3(1, 0, 0));
8 }
9 };
10
11 class CompositorListener2 : public Ogre::CompositorInstance::Listener
12 {
13 public:
14 void notifyMaterialSetup(uint32 pass_id, MaterialPtr& mat)
15 {
16 mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()
17 ->setNamedConstant("factors", Ogre::Vector3(0, 1, 0));
18 }
19 };
20
21 class CompositorListener3 : public Ogre::CompositorInstance::Listener
22 {
23 public:
24 void notifyMaterialSetup(uint32 pass_id, MaterialPtr& mat)
25 {
26 mat->getBestTechnique()->getPass(pass_id)->getFragmentProgramParameters()
27 ->setNamedConstant("factors", Ogre::Vector3(0, 0, 1));
28 }
29 };
30
31
32 class MyApplication :public ExampleApplication
33 {
34 public:
35 MyApplication()
36 {
37 compListener1_ = 0;
38 compListener2_ = 0;
39 compListener3_ = 0;
40 }
41
42 ~MyApplication()
43 {
44 if (compListener1_)
45 delete compListener1_;
46 if (compListener2_)
47 delete compListener2_;
48 if (compListener2_)
49 delete compListener3_;
50 }
51
52 void createCamera()
53 {
54 mCamera = mSceneMgr->createCamera("mycamera1");
55 mCamera->setPosition(Ogre::Vector3(0, 10, 20));
56 mCamera->lookAt(0, 0, 0);
57 mCamera->setNearClipDistance(5);
58 }
59
60 // 创建四个视口
61 void createViewports()
62 {
63 vp1_ = mWindow->addViewport(mCamera, 0, 0.0, 0.0, 0.5, 0.5);
64 vp1_->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
65
66 vp2_ = mWindow->addViewport(mCamera, 1, 0.5, 0.0, 0.5, 0.5);
67 vp2_->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
68
69 vp3_ = mWindow->addViewport(mCamera, 2, 0.0, 0.5, 0.5, 0.5);
70 vp3_->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
71
72 vp4_ = mWindow->addViewport(mCamera, 3, 0.5, 0.5, 0.5, 0.5);
73 vp4_->setBackgroundColour(Ogre::ColourValue(0.0, 0.0, 0.0));
74
75 mCamera->setAutoAspectRatio(Real(vp1_->getActualWidth()) / Real(vp1_->getActualHeight()));
76 }
77
78 void createScene()
79 {
80 Ogre::Entity* ent = mSceneMgr->createEntity("entity1", "Sinbad.mesh");
81 Ogre::SceneNode* node = mSceneMgr->getRootSceneNode()->createChildSceneNode("node1");
82 node->attachObject(ent);
83
84 // 为视口vp1_添加合成器:"compositor1",为合成器添加监听器compListener1_
85 Ogre::CompositorManager::getSingleton().addCompositor(vp1_, "compositor1");
86 Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp1_, "compositor1", true);
87 Ogre::CompositorInstance* comp1 = Ogre::CompositorManager::getSingleton().getCompositorChain(vp1_)->getCompositor("compositor1");
88 compListener1_ = new CompositorListener1;
89 comp1->addListener(compListener1_);
90
91 // 为视口vp2_添加合成器:"compositor1",为合成器添加监听器compListener3_
92 Ogre::CompositorManager::getSingleton().addCompositor(vp2_, "compositor1");
93 Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp2_, "compositor1", true);
94 Ogre::CompositorInstance* comp2 = Ogre::CompositorManager::getSingleton().getCompositorChain(vp2_)->getCompositor("compositor1");
95 compListener2_ = new CompositorListener2;
96 comp2->addListener(compListener2_);
97
98 // 为视口vp3_添加合成器:"compositor1",为合成器添加监听器compListener3_
99 Ogre::CompositorManager::getSingleton().addCompositor(vp3_, "compositor1");
100 Ogre::CompositorManager::getSingleton().setCompositorEnabled(vp3_, "compositor1", true);
101 Ogre::CompositorInstance* comp3 = Ogre::CompositorManager::getSingleton().getCompositorChain(vp3_)->getCompositor("compositor1");
102 compListener3_ = new CompositorListener3;
103 comp3->addListener(compListener3_);
104 }
105
106 private:
107 // Red视口
108 Ogre::Viewport* vp1_;
109 // Green视口
110 Ogre::Viewport* vp2_;
111 // Blue视口
112 Ogre::Viewport* vp3_;
113 // 默认视口
114 Ogre::Viewport* vp4_;
115
116 CompositorListener1* compListener1_;
117 CompositorListener2* compListener2_;
118 CompositorListener3* compListener3_;
119 };
120
121
122 int main()
123 {
124 MyApplication app;
125 app.go();
126 return 0;
127 }




原文地址:https://www.cnblogs.com/kex1n/p/2276768.html