食人魔3D:比RenderWindow更大的RenderTexture

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

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

2)主应用程序 ,其中一个平面显示(1)“子应用程序”中正在发生的事情,从共享内存中加载纹理。

(1)渲染的纹理与(2)中的平面使用的纹理具有相同的尺寸。 例如:512×512

如果RenderWindow大于或等于RenderTexture, 所有工作正常 。 你在(1)中看到的是反映在(2)飞机体面的fps。 共享内存很强大!

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

这就是发生在我身上的事情: renderwindow小于rendertexture

一些例子显示1×1的窗口和大的渲染纹理,所以我想可能有一个比窗口大的渲染纹理。

这是如何创build窗口:

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

这是如何创build渲染纹理:

 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的描述,这不是我期待的事情发生。 所以…这个食人魔的bug,还是opengl? 还是我做错了?

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

Solutions Collecting From Web of "食人魔3D:比RenderWindow更大的RenderTexture"

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

顺便说一句对不起,这是答案,而不是评论,但我不能写评论呢;]

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

调用_updateDimensions()应该修复它

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

确切地说,这是可以预料的,而且确实是正确的行为。 常规屏幕窗口的像素仅在通过所谓的像素所有权测试时才被处理。 这意味着,只有那些对用户可见的像素才会被渲染。 所以,如果你拖动一个窗口在你的OpenGL窗口前,这些像素将不会被渲染到任何一个; 在现代系统中使用所谓的合成窗口管理,其中窗口阻挡不会使像素所有权测试失败。

长话短说:如果你正在渲染东西以备以后处理,你必须完全在你的控制下完成一个帧缓冲区 :一个PBuffer或一个Frame Buffer Object