Ogre 3d: RenderTexture больш RenderWindow

У мяне ёсць два огров прыкладання:

1) Sub application, that render to a window and to a texture (using same camera). The texture is "exported" to shared memory (shm in linux)

2) Main application, where a plane shows what is happening in the (1) "sub application", loading the texture from shared memory.

Тэкстуры, дзе (1) аказвае мае такі ж памер, чым тэкстуры, якая выкарыстоўваецца ў плоскасці (2). Напрыклад.: 512x512

All works fine if the RenderWindow is bigger or equal than RenderTexture. What you see in (1) is reflected in (2) plane with decent fps. Shared memory is powerful!

Але калі вынесці акно менш тэкстуры, <моцны> толькі частка тэкстуры абнаўляецца .

This is what is happening to me: 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
  • Ogre: Версія 1.7.3 (Cthugha)
  • GL_VERSION = 4.0.0 NVIDIA 256,53
2
@crazyjul Так, гэта
дададзена аўтар Alessandro Pezzato, крыніца
@crazyjul спрабаваў з новай камерай, скапіяваны з іншага з newCamera-> synchroniseBaseSettingsWith (camera_); але вынік той жа
дададзена аўтар Alessandro Pezzato, крыніца
Ці ёсць у вас camera_ пераменная сумесна з вокнамі рэндэру мэта?
дададзена аўтар crazyjul, крыніца

3 адказы

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

ДАРЭЧЫ На жаль, гэта адказ і не каментаваць, але я не магу пісаць каментары];

1
дададзена
<Р> Але калі акно візуалізацыі менш тэкстуры, <моцны> толькі частка тэкстуры абнаўляецца.

Exactly this is to be expected and indeed the correct behaviour. Pixels of regular on-screen windows are only processed if they pass the so called pixel ownership test. What this means is, that only those pixels that will be visible to the user will be rendered at all. So if for example you drag a window in front of your OpenGL window, those pixels will not be rendered to either; on modern systems so called compositing window management is used, where obstruction by window will not fail the pixel ownership test.

Каб зрабіць доўгую гісторыю кароткай: Калі вы рэндэрынгу матэрыял для далейшай апрацоўкі вы павінны зрабіць гэта на фреймбуфером цалкам пад вашым кантролем: А <ет> піксельных буфер або Буфер кадра Аб'ект .

0
дададзена
@AlessandroPezzato: Якія АС і наборшчыкаў вы карыстаецеся? Ва ўсякім выпадку, вы не павінны выкарыстоўваць вокны ў якасці мэты візуалізацыі для візуалізацыі ва ўзор кантэнту. Выкарыстоўвайце FBO або піксельных буфер, гэта тое, што яны прызначаны для.
дададзена аўтар datenwolf, крыніца
Я зрабіў некаторыя тэсты наступнага Вашага адказу ... З кампазіт ўключана або выключана, то працягвае абнаўленне, нават калі вынесці акно не відаць (абцяжарана іншым акном, зніжэнне на абразок або на іншы віртуальным працоўным стале). Гэта адбываецца, калі я прымушаю абнаўленне з RenderTarget _-> абнаўленне (); . Так што я думаю, гэта не праблема. Дакладна?
дададзена аўтар Alessandro Pezzato, крыніца
Гэта KDE 4.6 з яго наборшчыкаў. Мая Ogre прыкладанне прадастаўляе да акна і тэкстуры ( ogre3d.org/tikiwiki/Intermediate+Tutorial+ 7 ).
дададзена аўтар Alessandro Pezzato, крыніца

If the target change in size, your camera needs to be updated : http://www.ogre3d.org/docs/api/html/classOgre_1_1Viewport.html#a23c2b69bbc3d76fd52a4729a71caed08

Выклік _updateDimensions() павінен гэта выправіць

0
дададзена
У дакументацыі сказана, _updateDimensions() з'яўляецца "<я> Унутраная выкарыстанне Огрэ толькі. ". Я спрабаваў выклікаць яго пасля VP-> setBackgroundColour (ColourValue :: Чорны); і перад RenderTarget _-> абнаўленне (); , але нічога не мяняецца.
дададзена аўтар Alessandro Pezzato, крыніца
Target не мяняе свой памер. Ёсць дзве розныя мішэні: RenderWindow і RenderTexture, і абодва яны не змяняюць свой памер. Мой прыклад паказвае, што адбываецца, калі RenderWindow больш, чым RenderTexture і наадварот.
дададзена аўтар Alessandro Pezzato, крыніца