第1个例子

main.cpp文件

#include "ExampleApplication.h"
//8 begin
class 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 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 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 begin
private: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 begin
compositor 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 begin
compositor 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 begin
compositor 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 begin
material 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 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 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 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 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 begin
private://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 begin
compositor 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 begin
fragment_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 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

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

  1. c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组

    以下是在堆上创建2D数组(或动态分配2D数组)的不同方法. 在以下示例中,我们将" r "视为行数,将" c "视为列数,并创建了一个二维数组,其中r = 3, ...

  2. python中如何调用函数_我写了一个函数,如何在python中调用

    匿名用户 1级 2015-03-06 回答 Python的特色简单 Python是一种代表简单主义思想的语言.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Pyth ...

  3. 中求和符号上下标_涨电脑知识:如何在word中编写复杂的公式,写论文必备技能...

    我们在用word写资料时,比如论文.数据分析.报告等,经常需要插入一些公式,这些公式会含有一些特殊符号,比如根号.分式.求和等,这些特殊符号是不能直接用输入法来完成的,需要借助于word扩展的功能来帮 ...

  4. excel中vlookup填充公式下拉怎么不好使了(如何在excel中vlookup为什么无法填充公式)...

    在EXCEL表格里用VLOOKUP搜索数据时,为什么往下拉多了就不灵了呢? 注意查找的值与搜索区域的值格式统一. 搜索区域Table_array,地址引用要用绝对地址,比如区域A1:E100要写成$A ...

  5. OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...

    OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...

  6. ubuntu 如何关闭离线模式_如何在macOS中打开或关闭Mac暗黑模式

    苹果在macOS Mojave中为Mac引入了暗模式.暗模式是系统级别的设置,可与Mac随附的所有应用一起使用.第三方应用也可以选择使用暗黑模式.暗黑模式使您更轻松地专注于工作,并且对眼睛也很容易.装 ...

  7. html中看到php代码_如何在HTML中嵌入PHP代码

    如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...

  8. linux 杀掉php,Linux_在Linux系统中使用xkill命令杀掉未响应的进程,我们如何在Linux中杀掉一个资 - phpStudy...

    在Linux系统中使用xkill命令杀掉未响应的进程 我们如何在Linux中杀掉一个资源/进程?很明显我们会找出资源的pid然后用kill命令. 说的更明白一点,我们可以找到某个资源(比如termin ...

  9. webgl 着色器_如何在WebAssembly中使用WebGL着色器

    webgl 着色器 by Dan Ruta 通过Dan Ruta 在WebAssembly中使用WebGL着色器 (Using WebGL shaders in WebAssembly) WebAss ...

最新文章

  1. 69 个经典 Spring 面试题和答案
  2. SAP Data Intelligence Modeler里的Kafka Producer和Kafka Consumer
  3. 遥感空间尺度转换技术(升尺度和降尺度)
  4. spring容器扩展功能之一:spring加载ApplicationContext.xml的四种方式
  5. python中reduce函数_Python中的reduce()函数
  6. RTX5 | 线程管理01 - 创建线程(静态堆栈方式)
  7. 全国python一级考试_全国青少年软件编程(Python)等级考试试卷(一级) 1-1
  8. python 文案自动生成_Python应用 | 利用COM技术自动生成IBM i2舞弊关系分析图表
  9. 【高校宿舍管理系统】第二章 整合Mybatis和写CRUD的基本流程以及使用代码生成器生成Mapper等相关代码
  10. CodeForces - 18A Triangle(数学?)
  11. 怎么把小写字母(英文)转换成大写
  12. java计算机毕业设计西安市城市绿地管理系统源码+系统+数据库+lw文档
  13. vue项目中使用思维导图mindmap
  14. 请使用hive udf或者spark udf实现父子关系树图分析,列举出所有的路径
  15. PG如何影响数据分布
  16. point\polyline\polygon的转化(转)
  17. 【深度学习】语义分割:论文阅读:(CVPR 2022) MPViT(CNN+Transformer):用于密集预测的多路径视觉Transformer
  18. 中国加油!武汉加油!
  19. 数据结构 Java数据结构 --- Lambda表达式
  20. 数据透视表日期怎么选范围_透视范围

热门文章

  1. C++面试题-面向对象-构造函数和析构函数
  2. GCC编译器简明教程(Linux下C语言开发环境的搭建)
  3. Halcon:标准标定板的自制方法
  4. 这是一台家庭计算机重启无效,我买了一台二手计算机,配置还可以,但有时会自动重启机器,这是为什? 爱问知识人...
  5. java中的greeting_JAVA基础知识——字符串
  6. RIP路由协议基本配置
  7. C# WinForm关闭窗体确认
  8. 剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)
  9. linux 下恢复文件权限设置,备份和恢复Linux文件权限的方法
  10. Go 基本语法之变量遮蔽问题