将新纹理绑定到现有FBO

时间:2013-01-09 00:47:29

标签: opengl fbo

我希望将新纹理绑定到现有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是犯罪者,所以也许在这个过程开始之前创建纹理是一个想法? 另外,我可能不需要每次都创建渲染缓冲区,但是你可以节省一些时间并告诉我是否需要它。:)

1 个答案:

答案 0 :(得分:1)

性能打击在于呼叫glTexImage2D,这是一个非常昂贵的呼叫。如果您只想绑定已存在的纹理,则不必创建新的纹理对象,也不需要重新初始化它。

只需拨打glFramebufferTexture2D即可。无需提前绑定纹理;实际上,纹理不能被绑定用作帧缓冲目标。