2

我有两个食人魔应用程序:

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?还是我做错了?

  • 操作系统:Linux
  • 食人魔:版本 1.7.3 (Cthugha)
  • GL_VERSION = 4.0.0 英伟达 256.53
4

3 回答 3

1

我不确定这是否有很大帮助(可能为时已晚),但前段时间我读到 OpenGL 无法渲染到大于它正在使用的窗口的纹理。DX 能够做到这一点,但 OGL 不能。

顺便说一句,对不起,这是答案而不是评论,但我还不能写评论;]

于 2012-07-24T14:51:45.373 回答
0

如果目标尺寸发生变化,您的相机需要更新:http ://www.ogre3d.org/docs/api/html/classOgre_1_1Viewport.html#a23c2b69bbc3d76fd52a4729a71caed08

调用_updateDimensions()应该修复它

于 2011-10-28T15:08:55.090 回答
0

但如果渲染窗口小于纹理,则只更新一部分纹理。

正是这是可以预料的,而且确实是正确的行为。只有通过所谓的像素所有权测试,才会处理常规屏幕窗口的像素。这意味着,只有那些对用户可见的像素才会被渲染。因此,例如,如果您将一个窗口拖到您的 OpenGL 窗口前面,这些像素将不会被渲染到任何一个;在现代系统上使用所谓的合成窗口管理,其中窗口的阻碍不会通过像素所有权测试。

长话短说:如果您正在渲染内容以供以后处理,则必须在完全由您控制的帧缓冲区上进行:A PBufferFrame Buffer Object

于 2011-10-28T16:10:34.057 回答