Огр 3d: RenderTexture больше, чем RenderWindow - PullRequest
2 голосов
/ 28 октября 2011

У меня есть два приложения огров:

1) Подприложение , которое рендерится в окно и текстуру (используя ту же камеру). Текстура «экспортируется» в разделяемую память (shm в linux)

2) Главное приложение , где плоскость показывает, что происходит в (1) «субприложении», загружая текстуру из общей памяти.

Текстура, в которой визуализация (1) имеет тот же размер, что и текстура, используемая плоскостью в (2). Например: 512x512

Все работает нормально , если RenderWindow больше или равно RenderTexture. То, что вы видите в (1), отражается в плоскости (2) с приличными кадрами в секунду. Общая память мощна!

Но если окно рендеринга меньше, чем текстура, обновляется только часть текстуры .

Вот что со мной происходит: 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 ]

1 голос
/ 24 июля 2012

Я не уверен, что это сильно поможет (и, возможно, слишком поздно), но некоторое время назад я читал, что OpenGL не может рендерить текстуру, которая больше, чем окно, которое он использует.DX способен сделать это, но не OGL.

Кстати, извините, это ответ, а не комментарий, но я пока не могу писать комментарии;]

0 голосов
/ 28 октября 2011

Но если окно рендеринга меньше, чем текстура, обновляется только часть текстуры.

Именно этого и следует ожидать.Пиксели обычных экранных окон обрабатываются только в том случае, если они проходят так называемый тест владения пикселем .Это означает, что только те пиксели, которые будут видны пользователю, будут отображаться вообще.Так, например, если вы перетаскиваете окно перед окном OpenGL, эти пиксели также не будут отображаться; в современных системах используется так называемое управление окном композитинга, когда препятствие окну не подведет тест владения пикселем.

Короче говоря: если вы рендерите материал на потомДля обработки вы должны сделать это на кадровом буфере полностью под вашим контролем: A PBuffer или Объект буфера кадров .

0 голосов
/ 28 октября 2011

Если цель изменилась в размере, ваша камера должна быть обновлена: http://www.ogre3d.org/docs/api/html/classOgre_1_1Viewport.html#a23c2b69bbc3d76fd52a4729a71caed08

Звонок на _updateDimensions() должен исправить это

...