2

私は2つの鬼のアプリケーションを持っています:

1)サブアプリケーション。ウィンドウとテクスチャにレンダリングします(同じカメラを使用)。テクスチャは共有メモリに「エクスポート」されます(Linuxではshm)

2)メインアプリケーション。プレーンは(1)「サブアプリケーション」で何が起こっているかを示し、共有メモリからテクスチャをロードします。

(1)がレンダリングするテクスチャは、(2)の平面で使用されるテクスチャと同じサイズです。例:512x512

RenderWindowがRenderTextureより大きいか等しい場合、すべて正常に機能します。(1)で見たものは、まともなfpsで(2)平面に反映されます。共有メモリは強力です!

ただし、レンダリングウィンドウがテクスチャよりも小さい場合は、テクスチャの一部のみが更新されます。

これが私に起こっていることです: rendertextureよりも小さいrenderwindow

いくつかの例は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ですか?それとも私はそれを間違っていますか?

  • OS:Linux
  • 鬼:バージョン1.7.3(Cthugha)
  • GL_VERSION = 4.0.0 NVIDIA 256.53
4

3 に答える 3

1

それが大いに役立つかどうかはわかりませんが (おそらく遅すぎます)、OpenGL は使用しているウィンドウよりも大きいテクスチャにレンダリングできないことを以前に読みました。DX はこれを行うことができますが、OGL はできません。

ところで申し訳ありませんが、コメントではなく回答ですが、まだコメントを書くことはできません;]

于 2012-07-24T14:51:45.373 に答える
0

ただし、レンダリング ウィンドウがテクスチャよりも小さい場合、テクスチャの一部のみが更新されます。

まさにこれは予想されることであり、実際に正しい動作です。通常の画面上のウィンドウのピクセルは、いわゆるピクセル所有権テストに合格した場合にのみ処理されます。これが意味することは、ユーザーに表示されるピクセルのみがレンダリングされるということです。たとえば、OpenGL ウィンドウの前にウィンドウをドラッグすると、それらのピクセルはどちらにもレンダリングされません。現代のシステムでは、いわゆる合成ウィンドウ管理が使用されており、ウィンドウによる障害物がピクセル所有権テストに失敗することはありません。

簡単に言うと、後で処理するために何かをレンダリングしている場合は、完全に制御できるフレームバッファーでそれを行う必要があります: A PBufferまたはFrame Buffer Object

于 2011-10-28T16:10:34.057 に答える
0

ターゲットのサイズが変更された場合、カメラを更新する必要があります: http://www.ogre3d.org/docs/api/html/classOgre_1_1Viewport.html#a23c2b69bbc3d76fd52a4729a71caed08

への呼び出し_updateDimensions()はそれを修正する必要があります

于 2011-10-28T15:08:55.090 に答える