У меня есть два приложения огров:
1) Подприложение , которое рендерится в окно и текстуру (используя ту же камеру). Текстура «экспортируется» в разделяемую память (shm в linux)
2) Главное приложение , где плоскость показывает, что происходит в (1) «субприложении», загружая текстуру из общей памяти.
Текстура, в которой визуализация (1) имеет тот же размер, что и текстура, используемая плоскостью в (2). Например: 512x512
Все работает нормально , если RenderWindow больше или равно RenderTexture.
То, что вы видите в (1), отражается в плоскости (2) с приличными кадрами в секунду. Общая память мощна!
Но если окно рендеринга меньше, чем текстура, обновляется только часть текстуры .
Вот что со мной происходит:
В некоторых примерах показано окно размером 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