我有两个食人魔应用程序:
1)子应用程序,渲染到窗口和纹理(使用相同的相机)。纹理被“导出”到共享内存(Linux中的shm)
2)主应用程序,其中一架飞机显示(1)“子应用程序”中发生的情况,从共享内存加载纹理。
(1)渲染的纹理与(2)中的平面使用的纹理大小相同。例如:512x512
如果RenderWindow大于或等于RenderTexture,一切正常。 你在(1)中看到的内容反映在(2)平面上,具有不错的fps。共享内存功能强大!
但如果渲染窗口小于纹理,只会更新纹理的一部分。
这就是我发生的事情:
一些例子显示了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?或者我做错了吗?
答案 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 或帧缓冲区对象