Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 修改帧缓冲区内容时出现问题_Opengl - Fatal编程技术网

Opengl 修改帧缓冲区内容时出现问题

Opengl 修改帧缓冲区内容时出现问题,opengl,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.h

我试图旋转帧缓冲区的内容,将其放入纹理,然后将其放回缓冲区。我得到一个白色的旋转矩形。我怀疑我忽略了一些显而易见的事情。以下是我正在使用的代码:

  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);

无法使用glCopyTexImage2D创建纹理,只能将数据复制到纹理,但此阶段的纹理不完整,因此会得到黑色/白色纹理(表示未完成状态)

解决方案:使用以下内容创建纹理:

glGenTextures(....)
glBindTexture(...)
glTexParameter(...) //Set MIN/MAG filter
glTexImage2D(....., NULL)

glTexImage2D定义纹理图像,当您要渲染到此纹理(或复制到此纹理)时,可以为最后一个参数传递NULL,以便创建纹理备份存储,但其内容未定义。另一个建议是使用帧缓冲区对象(FBO)直接绘制到纹理中(无副本)

发布纹理创建代码。glCopyTexImage2d是纹理创建代码(如果我正确阅读手册页)。AUX1缓冲区是使用组合向量和纹理技术在一段时间内建立起来的。在这段代码中,我创建了一个临时纹理来旋转AUX1缓冲区内容,然后将它们放回原处。