0

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

4

1 回答 1

1

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

只要打电话glFramebufferTexture2D就够了。无需提前绑定贴图;事实上,纹理不能被绑定用作帧缓冲目标。

于 2013-01-09T08:59:05.790 回答