修改帧缓冲区内容的麻烦

时间:2011-04-26 11:18:35

标签: opengl

我试图通过将帧缓冲区的内容放入纹理然后将其放回缓冲区来旋转帧缓冲区的内容。我得到一个白色旋转的矩形。我怀疑我忽略了一些明显的东西。这是我正在使用的代码:

  glReadBuffer(GL_AUX1);
  glEnable(GL_TEXTURE_2D);
  glBindTexture(GL_TEXTURE_2D, textures[1]);
  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, rect.width(),
        rect.height(), 0);
  glDrawBuffer(GL_AUX1);
  glPushMatrix();
  glRotatef(head - new_head, 0, 0, -1);
  glBegin(GL_POLYGON);
  glTexCoord2f(0, 0);
  glVertex2f(-1, -1);
  glTexCoord2f(0, 1);
  glVertex2f(-1, 1);
  glTexCoord2f(1, 1);
  glVertex2f(1, 1);
  glTexCoord2f(1, 0);
  glVertex2f(1, -1);
  glEnd();
  glPopMatrix();
  glDisable(GL_TEXTURE_2D);

我已经解决了这个问题。添加这些行以使其工作:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

1 个答案:

答案 0 :(得分:1)

您不能使用glCopyTexImage2D创建纹理,只能将数据复制到纹理,但在此阶段纹理不完整,因此您将获得黑/白纹理(指示不完整状态)。

解决方案:使用:

创建纹理
glGenTextures(....)
glBindTexture(...)
glTexParameter(...) //Set MIN/MAG filter
glTexImage2D(....., NULL)

glTexImage2D定义纹理图像,因为你想要渲染到这个纹理(或复制到它),你为最后的参数传递NULL,所以创建纹理后备存储,但它的内容是未定义的。另一个建议是使用帧缓冲对象(FBO)直接绘制到纹理(没有副本)