查看: 2241|回复: 4

能否给简要介绍下osg中MRT的大致流程

[复制链接]

该用户从未签到

发表于 2009-2-19 13:19:45 | 显示全部楼层 |阅读模式
我看了osgmultiplerendertargets的工程,但是还是没搞明白其正确的流程。版主能否给详解一下要领和大致的步骤?
谢谢

该用户从未签到

发表于 2009-2-19 13:32:28 | 显示全部楼层
其实这个和osgprerender的工作原理差不多,也是把纹理或者图片绑定到摄像机上,以实现RTT渲染到纹理。不过MRT的意思就是gl_FragColor可以不止有一个输出,例如这个例子里面就分别输出四个颜色缓存的内容到四个TextureRect对象中

该用户从未签到

 楼主| 发表于 2009-2-19 15:28:00 | 显示全部楼层
首先, 在RTT之前,要把多个纹理单元绑定到osg::Camera类中,如下:
            camera->attach(osg::Camera::BufferComponent(osg::Camera::COLOR_BUFFER0+i), textureRect);

其次,要为camera设置一个osg:rawable对象(一般来说,就是一个GL_QUAD),在这个类中通过编写pixel shader,将场景绘制到以上设置的textureRect中,如下(RTT):
            gl_FragData = color;

再次,如果要对产生的纹理进行后处理(PostProcess),那就需要另外创建osg::Drawable对象,并把以上生成的 textureRect作为该对象的纹理,同时编写相应的 PostProcess Pixel Shader 来对这些纹理进行处理。

其中,关键的一点就是既要把 textureRect 同时设置为osg::Camera的Frame Buffer Object,又要将其设置为PostProcess中的 osg::Drawable对象的纹理。 另外,别忘了要设置: camera->setRenderOrder(osg::Camera:RE_RENDER),这样,可以保证 textureRect在主camera对整个场景绘制之前已经产生。

该用户从未签到

发表于 2009-2-19 16:06:33 | 显示全部楼层
写得不错~~支持一下,建立大家经常都将自己的研究心得整理出来,与朋友们分享。

有一些我个人的意见或者异议,附在下面:
1、Drawable对象只是用来演示用的,把它换成母牛也无妨,或者不存在这么一个显示的载体也无妨。此外“编写pixel shader,将场景绘制到……”这一段的内容我个人认为不太清楚。这里的关键在于attach函数中颜色缓存COLOR_BUFFER和纹理对象的关联,不编写Shader代码也没什么关系。

2、RTT的主要流程如下:
(1)首先要有一个专用于渲染到纹理的摄像机节点,它的所有子节点都将被渲染到指定的纹理上;
(2)设置要渲染的纹理尺寸,并与摄像机的Viewport视口相符,摄像机的观察和投影矩阵设置决定了渲染场景的观察和投影方式;
(3)设置setRenderTargetImplementation,使用FBO或者PBO都是可以渲染到纹理的,对于较新的显示设备而言,FBO有更高的效率;
(4)设置attach,设置RTT的目标,也就是纹理对象,TextureRectangle,Texture2D等等都是可以的,取决于用户的实际需求,此外OSG也可以进一步渲染到Image对象中;
(5)得到的纹理可以关联到别的场景模型上,也可以直接从中把数据读出来(getImage()->data()),不一定要使用Shader再操作。假设我们要进行很多相互独立数据的并行运算的话,可以使用Uniform输入纹理对象作为运算因子,Shader中编写算式,然后把输出的纹理理解成计算结果——这就是GPGPU的基本概念。对于较新的显示设备来说,可以使用浮点纹理,因此运算精度上也有所保证(MRT例子中使用TextureRectangle而非Texture2D的意义其实在于此)。

[ 本帖最后由 array 于 2009-2-19 16:13 编辑 ]

该用户从未签到

 楼主| 发表于 2009-2-19 16:35:55 | 显示全部楼层
版主功力深厚,领教了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表