【问题标题】:Bind new texture to existing FBO将新纹理绑定到现有 FBO
【发布时间】:2013-01-09 21:22:07
【问题描述】:

我希望将新纹理绑定到现有 FBO。但目前它显着降低了我的速度。

        int holdTextureId = glGenTextures();

        glBindTexture(GL_TEXTURE_2D, 0);
        glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, panoramaModelsFboId); 

        glBindTexture(GL_TEXTURE_2D, holdTextureId);                                
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);                   
        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);           
        glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, SAVE_WIDTH, SAVE_HEIGHT, 0,GL_RGBA, GL_INT, (java.nio.ByteBuffer) null);
        glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT,GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_2D, holdTextureId, 0);

        glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, panoramaModelsDepthRenderBufferId);              
        glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT, SAVE_WIDTH, SAVE_HEIGHT);
        glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT,GL_DEPTH_ATTACHMENT_EXT,GL_RENDERBUFFER_EXT, panoramaModelsDepthRenderBufferId);

  //Rendering starts here..
  // After which I unbind the FBO and use the texture

我有一种感觉 glTexImage2D 是肇事者,所以也许在这个过程开始之前创建纹理是一个想法? 另外,我可能不需要每次都创建渲染缓冲区,但您可以节省我一些时间并告诉我是否需要它:)

【问题讨论】:

    标签: opengl fbo


    【解决方案1】:

    性能损失在于调用glTexImage2D,这是一个非常昂贵的调用。如果你只是想绑定一个已经存在的纹理,你不需要创建一个新的纹理对象,也不需要重新初始化它。

    只需拨打glFramebufferTexture2D 就足够了。无需提前绑定贴图;事实上,纹理不能被绑定为帧缓冲目标。

    【讨论】:

    • 我确实注意到 glFramebufferTexture2DEXT 是一个沉重的电话,不知道为什么。你现在碰巧如何让它更快?
    • @RobotRock:实际上可能需要完成之前的渲染操作,因为 glFramebufferTexture 是一个同步点。在这种情况下,以三重缓冲方式使用多个纹理和 FBO 可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多