绑定fbo时,你需要每帧调用glFramebufferTexture2D吗?

时间:2015-05-31 04:55:23

标签: android ios opengl-es

在我绑定FBO的每个并条机上,我应该打电话给

GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,
                GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D,
                ResourceManager.windowTex[0], 0);

你是否应该在初始化帧缓冲区或每帧时调用它?除非我在glBindFramebuffer之后调用它,否则它不会为我画画。

1 个答案:

答案 0 :(得分:1)

附件绑定是FBO状态的一部分。你只需要调用glFramebufferTexture2D()一次,而绑定FBO。当您稍后再次绑定相同的FBO时,仍会附加相同的纹理。

一个可能的陷阱是纹理对象必须先创建才能连接到FBO。单独生成名称是不够的,它需要至少绑定一次才能创建实际的纹理对象。例如,以下内容为错误

GLuint texId = 0;
glGenTextures(1, &texId);

GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER,
    GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0);

glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(...);

在附加到FBO之前,在这种情况下未创建纹理对象。另一方面,以下内容有效:

GLuint texId = 0;
glGenTextures(1, &texId);
glBindTexture(GL_TEXTURE_2D, texId);
glBindTexture(GL_TEXTURE_2D, 0);

GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glFramebufferTexture2D(GL_FRAMEBUFFER,
    GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0);

glBindTexture(GL_TEXTURE_2D, texId);
glTexImage2D(...);

请注意,在调用glFramebufferTexture2D()时,纹理不必当前绑定,并且在此时也不需要指定纹理数据。它只需要绑定至少一次就可以触发纹理对象的创建。