第八章 OGRE中合成器(也就是传说中的image-based rendering)以及如何在OGRE中对着色器的uniform变量传值
第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变量传值相关推荐
- c++ 返回数组中最大的值_4个代码块教您如何在C中动态分配2D数组
以下是在堆上创建2D数组(或动态分配2D数组)的不同方法. 在以下示例中,我们将" r "视为行数,将" c "视为列数,并创建了一个二维数组,其中r = 3, ...
- python中如何调用函数_我写了一个函数,如何在python中调用
匿名用户 1级 2015-03-06 回答 Python的特色简单 Python是一种代表简单主义思想的语言.阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Pyth ...
- 中求和符号上下标_涨电脑知识:如何在word中编写复杂的公式,写论文必备技能...
我们在用word写资料时,比如论文.数据分析.报告等,经常需要插入一些公式,这些公式会含有一些特殊符号,比如根号.分式.求和等,这些特殊符号是不能直接用输入法来完成的,需要借助于word扩展的功能来帮 ...
- excel中vlookup填充公式下拉怎么不好使了(如何在excel中vlookup为什么无法填充公式)...
在EXCEL表格里用VLOOKUP搜索数据时,为什么往下拉多了就不灵了呢? 注意查找的值与搜索区域的值格式统一. 搜索区域Table_array,地址引用要用绝对地址,比如区域A1:E100要写成$A ...
- OpenGL ES着色器语言之语句和结构体(官方文档第六章)内建变量(官方文档第七、八章)...
OpenGL ES着色器语言之语句和结构体(官方文档第六章) OpenGL ES着色器语言的程序块基本构成如下: 语句和声明 函数定义 选择(if-else) 迭代(for, while, do-wh ...
- ubuntu 如何关闭离线模式_如何在macOS中打开或关闭Mac暗黑模式
苹果在macOS Mojave中为Mac引入了暗模式.暗模式是系统级别的设置,可与Mac随附的所有应用一起使用.第三方应用也可以选择使用暗黑模式.暗黑模式使您更轻松地专注于工作,并且对眼睛也很容易.装 ...
- html中看到php代码_如何在HTML中嵌入PHP代码
如何在HTML中嵌入PHP代码 对于一个有经验的 PHP Web 开发者,在HTML中嵌入PHP代码是一件非常容易的事情.但是对于刚开始接触 PHP 编程语言的新手这就是一个问题.下面是小编为大家带来 ...
- linux 杀掉php,Linux_在Linux系统中使用xkill命令杀掉未响应的进程,我们如何在Linux中杀掉一个资 - phpStudy...
在Linux系统中使用xkill命令杀掉未响应的进程 我们如何在Linux中杀掉一个资源/进程?很明显我们会找出资源的pid然后用kill命令. 说的更明白一点,我们可以找到某个资源(比如termin ...
- webgl 着色器_如何在WebAssembly中使用WebGL着色器
webgl 着色器 by Dan Ruta 通过Dan Ruta 在WebAssembly中使用WebGL着色器 (Using WebGL shaders in WebAssembly) WebAss ...
最新文章
- 69 个经典 Spring 面试题和答案
- SAP Data Intelligence Modeler里的Kafka Producer和Kafka Consumer
- 遥感空间尺度转换技术(升尺度和降尺度)
- spring容器扩展功能之一:spring加载ApplicationContext.xml的四种方式
- python中reduce函数_Python中的reduce()函数
- RTX5 | 线程管理01 - 创建线程(静态堆栈方式)
- 全国python一级考试_全国青少年软件编程(Python)等级考试试卷(一级) 1-1
- python 文案自动生成_Python应用 | 利用COM技术自动生成IBM i2舞弊关系分析图表
- 【高校宿舍管理系统】第二章 整合Mybatis和写CRUD的基本流程以及使用代码生成器生成Mapper等相关代码
- CodeForces - 18A Triangle(数学?)
- 怎么把小写字母(英文)转换成大写
- java计算机毕业设计西安市城市绿地管理系统源码+系统+数据库+lw文档
- vue项目中使用思维导图mindmap
- 请使用hive udf或者spark udf实现父子关系树图分析,列举出所有的路径
- PG如何影响数据分布
- point\polyline\polygon的转化(转)
- 【深度学习】语义分割:论文阅读:(CVPR 2022) MPViT(CNN+Transformer):用于密集预测的多路径视觉Transformer
- 中国加油!武汉加油!
- 数据结构 Java数据结构 --- Lambda表达式
- 数据透视表日期怎么选范围_透视范围
热门文章
- C++面试题-面向对象-构造函数和析构函数
- GCC编译器简明教程(Linux下C语言开发环境的搭建)
- Halcon:标准标定板的自制方法
- 这是一台家庭计算机重启无效,我买了一台二手计算机,配置还可以,但有时会自动重启机器,这是为什? 爱问知识人...
- java中的greeting_JAVA基础知识——字符串
- RIP路由协议基本配置
- C# WinForm关闭窗体确认
- 剑指offer(C++)-JZ77:按之字形顺序打印二叉树(数据结构-树)
- linux 下恢复文件权限设置,备份和恢复Linux文件权限的方法
- Go 基本语法之变量遮蔽问题