Ogre 3d:RenderTexture比RenderWindow更大

时间:2011-10-28 14:05:43

标签: c++ linux opengl ogre3d

我有两个食人魔应用程序:

1)子应用程序,渲染到窗口和纹理(使用相同的相机)。纹理被“导出”到共享内存(Linux中的shm)

2)主应用程序,其中一架飞机显示(1)“子应用程序”中发生的情况,从共享内存加载纹理。

(1)渲染的纹理与(2)中的平面使用的纹理大小相同。例如:512x512

如果RenderWindow大于或等于RenderTexture,

一切正常。 你在(1)中看到的内容反映在(2)平面上,具有不错的fps。共享内存功能强大!

但如果渲染窗口小于纹理,只会更新纹理的一部分

这就是我发生的事情: renderwindow smaller than rendertexture

一些例子显示了1x1窗口和大渲染纹理,所以我想可以使渲染纹理大于窗口。

这就是窗口的创建方式:

window_ = root_->createRenderWindow("blablah"), 256, 256, false);

这是渲染纹理的创建方式:

TextureManager* tm = TextureManager::getSingletonPtr();
TexturePtr rttTexture = tm->createManual(
/**/"MainRTT"
/**/, ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME
/**/, TEX_TYPE_2D
/**/, 512
/**/, 512
/**/, 0
/**/, PF_R8G8B8A8
/**/, TU_RENDERTARGET);
RenderTexture* renderTarget = rttTexture->getBuffer()->getRenderTarget();
renderTarget->addViewport(camera_);
renderTarget->setAutoUpdated(false);
Viewport* vp = renderTarget->getViewport(0);
vp->setClearEveryFrame(true);
vp->setOverlaysEnabled(true);
vp->setBackgroundColour(ColourValue::Black);

这就是我更新渲染纹理的方法:

class ShmTexUpdater: public Ogre::FrameListener {
public:
    ShmTexUpdater(const int& width, const int& height, void* data,
            const TexturePtr& tex) :
        /**/width_(width)
        /**/, height_(height)
        /**/, data_(data)
        /**/, tex_(tex)
        /**/, buf_(tex->getBuffer())
        /**/, renderTarget_(tex->getBuffer()->getRenderTarget()){

    }
    virtual ~ShmTexUpdater() {

    }
private:
    virtual bool frameStarted(const FrameEvent& evt) {
        FrameWork::instance()->window()->update();
        buf_->lock(Ogre::HardwareBuffer::HBL_NORMAL);
        renderTarget_->update();
        tex_->getBuffer()->blitToMemory(
        /**/PixelBox(width_, height_, 1, ShmTexture4k::FORMAT, data_));
        buf_->unlock();
        return true;
    }
    int const width_;
    int const height_;
    void* const data_;
    TexturePtr const tex_;
    HardwarePixelBufferSharedPtr buf_;
    RenderTexture* renderTarget_;
};

阅读RenderWindow和RenderTexture的描述,这不是我期望发生的事情。那么......这个食人魔虫还是opengl?或者我做错了吗?

  • 操作系统:Linux
  • 食人魔:1.7.3版(Cthugha)
  • GL_VERSION = 4.0.0 NVIDIA 256.53

3 个答案:

答案 0 :(得分:1)

我不确定它是否有很多帮助(可能为时已晚)但是前段时间我已经读过OpenGL无法渲染到比它正在使用的窗口更大的纹理。 DX能够做到这一点,但不是OGL。

BTW很抱歉这是答案而不是评论,但我还不能写评论;]

答案 1 :(得分:0)

如果目标尺寸发生变化,则需要更新相机:http://www.ogre3d.org/docs/api/html/classOgre_1_1Viewport.html#a23c2b69bbc3d76fd52a4729a71caed08

致电_updateDimensions()应该修复它

答案 2 :(得分:0)

  

但如果渲染窗口小于纹理,只会更新纹理的一部分。

这正是预期的,而且确实是正确的行为。只有在通过所谓的像素所有权测试时,才会处理常规屏幕窗口的像素。这意味着,只有那些对用户可见的像素才会被渲染。因此,例如,如果您在OpenGL窗口前面拖动一个窗口,那么这些像素也不会被渲染到; 在现代系统中使用所谓的合成窗口管理,其中窗口阻塞不会使像素所有权测试失败。

总而言之:如果您要渲染内容以供日后处理,则必须在完全由您控制的帧缓冲区上执行此操作: PBuffer 帧缓冲区对象