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

1)子应用程序,可渲染到窗口和纹理(使用同一台摄像机)。纹理被“导出”到共享内存(在Linux中为shm)

2)主应用程序,其中平面显示(1)“子应用程序”中正在发生的事情,并从共享内存中加载纹理。

(1)渲染的纹理与(2)中的平面使用的纹理具有相同的大小。例如:512x512

如果RenderWindow大于或等于RenderTexture,则都可以正常工作。
您在(1)中看到的内容将以适当的fps反射(reflect)在(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
  • Ogre:版本1.7.3(Cthugha)
  • GL_VERSION = 4.0.0 NVIDIA 256.53
  • 最佳答案

    我不确定是否有太多帮助(可能为时已晚),但是前一段时间,我读到OpenGL无法渲染到大于其使用的窗口的纹理。 DX可以执行此操作,但OGL不行。

    顺便说一句,对不起,这是答案,没有评论,但我还不能发表评论;]

    10-04 20:17