环境说明
代码使用osg3.6版本。不同版本的API会有变化,可能编译不过或没有效果。如果要运行代码,请确定使用osg3.6版本。
本文以Qt作为渲染窗口载体,osgqt的编译实现不在介绍范围内,默认已经编译通过。
RTT相机简介
RTT(Render To Texture,渲染到纹理)是一种极其核心的图形渲染技术。它的核心思想是:将场景的渲染结果不直接输出到屏幕上,而是输出到一个或多个纹理对象中1。这些纹理随后可以像普通纹理一样,被用作其他几何体的贴图,从而实现各种高级渲染效果。
RTT 的实现主要依赖于 osg::Camera 对象。OSG 通过以下几个关键机制来控制渲染输出:
渲染目标 (Render Target):通过 osg::Camera::attach() 方法,指定渲染的输出目标。这个目标通常是一个 FBO (Frame Buffer Object) 绑定的纹理 (osg::Texture2D) 或渲染缓冲 (RenderBuffer)。
渲染顺序 (Render Order):通过 setRenderOrder() 设置 RTT 相机的渲染时机。通常设置为 PRE_RENDER(在主场景渲染之前)或 POST_RENDER(在主场景渲染之后),以确保纹理在被主场景使用前已经生成完毕。
底层实现:OSG 提供了多种底层实现方式,其中 FRAME_BUFFER_OBJECT (FBO) 是最常用且最高效的方式。FBO 允许应用程序重定向渲染输出,避免了低效的内存拷贝。
代码实现
//RTTCamera.h
#include <Windows.h>
#include <osg/Camera> #include <osg/Texture2D> #include <osg/ref_ptr> #include <osg/Referenced>
/* * RTT相机类,Render To Texture */ class RTTCamera : public osg::Referenced {
public: osg::ref_ptr<osg::Image> m_ptrImage; osg::ref_ptr<osg::Texture2D> m_ptrTexture; osg::ref_ptr<osg::Camera> m_ptrInternalCamera;
public: /* * w: 窗口宽 * h: 窗口高 * pScene: 相机要渲染的根节点 */ RTTCamera(osg::Node* pScene, int w, int h);
~RTTCamera(); };
//RTTCamera.cpp
#include \”RTTCamera.h\”
RTTCamera::RTTCamera(osg::Node* pScene, int w, int h) {
m_ptrImage = new osg::Image; m_ptrImage->allocateImage




