在我绑定FBO的每个并条机上,我应该打电话给
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER,
GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D,
ResourceManager.windowTex[0], 0);
你是否应该在初始化帧缓冲区或每帧时调用它?除非我在glBindFramebuffer
之后调用它,否则它不会为我画画。
答案 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()
时,纹理不必当前绑定,并且在此时也不需要指定纹理数据。它只需要绑定至少一次就可以触发纹理对象的创建。