1.2 osg中渲染到纹理方法 渲染到纹理可以使用glReadPixels()从像素缓冲区拷贝,然后glTexImage()赋值给纹理;也可以使用glCopyTexSubImage();也可以直接渲染到FBO,再使用FBO中的纹理附件。osg::Camera类中方法setRenderTargetImplementation()可以设置渲染目标为FRAME_BUFFER_OBJECT、PIXEL_BUFFER、FRAME_BUFFER中一种对应...
camera->setClearMask(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); camera->setPostDrawCallBack(new FBOPostDrawCallback); camera->setRenderOrder(osg::Camera::PRE_RENDER,20); camera->setViewPort(0,0,width,height); if(tex) { tex->setFilter(osg::Texture::MIN_FILTER,osg::Texture::LINER_MIPMA...
由于我们不需要将渲染好的像素显示到屏幕上,因此我们可以使用framebuffer object,将像素放到fbo上,然后通过glReadPixels来最终获取渲染好的像素。 有时,我们想通过GPU做一些视频、图像处理,而处理的结果不需要显示在显示器上,而是直接交给主存,这时候我们可以通过OpenGL的离屏渲染来实现。 由于我们不需要将渲染好的像素显示...
在OSG中,纹理通常是通过osg::Texture2D类来表示的。 要渲染到纹理,你需要创建一个帧缓冲区对象(FBO),并将场景渲染到这个FBO上。 查找或编写osg渲染到纹理的代码示例: 下面是一个简单的代码示例,展示了如何在OSG中将场景渲染到一个纹理上: cpp #include <osg/Geode> #include <osg/Group> #inc...
渲染顺序PRE_RENDER指示此摄像机在渲染到主场景之前进行渲染。我们将FBO指定为渲染的目标,并将纹理附加到摄像机。现在我们将摄像机设置为在绝对坐标系中工作,作为场景,我们设置了要渲染为纹理的子树:使用附加的Cessna模型进行旋转转换: camera->setReferenceFrame(osg::Camera::ABSOLUTE_RF); ...
OSG中使用FBO的方式是: camera->setRenderTargetImplementation( osg::Camera::FRAME_BUFFER ); 渲染到纹理实例: #include <osg/Camera> #include <osg/Texture2D> #include <osgDB/ReadFile> #include <osgGA/TrackballManipulator> #include <osgViewer/Viewer> ...
第二种方法的好处是:界面和渲染原生分开,性能较好,由于是frame buffer object(简称fbo),渲染的结果可以直接显示,也可以给其他组件作为纹理输入。缺点是:多线程需要处理好同步(Renderer有synchronize函数用于数据同步,但由于render是在渲染线程调用的,所以复杂情况下仍然要做同步处理)。
继承QQuickItem,Osg先初始化,渲染成FBO,通过接口updatePaintNode()来更新FBO数据. 第一种方法实现起来比较优雅方便,但是不支持多pass渲染,本文主要介绍第二种。在本文用EventAdapter继承QQuickItem作为连接QtQuick与Osg的一个基类,后面只要继承这个类并注册到qml就可以了。
一)演示了一种叫做"Ping-Pong"的渲染技术,它是指利用FBO和两张纹理对象,在着色程序中以一个纹理为输入把计算结果写入另一个纹理,然后反转输入输出纹理再进行相同的操作,如此迭代。 二)其中用到的"GameOfLife"是使用Ping-Pong处理图片并输出的一个示例。
// 绑定一张image获取fbo渲染结果 if (useImage) { // which texture to get the image from const int tex_to_get = 0; osg::Image* image = new osg::Image; if (useHDR) { image->allocateImage(tex_width, tex_height, 1, GL_RGBA, GL_FLOAT); ...