C++ 在OpenGL ES 2.0中将多个纹理附着到单个FBO(和)多个FBO

C++ 在OpenGL ES 2.0中将多个纹理附着到单个FBO(和)多个FBO,c++,opengl-es-2.0,C++,Opengl Es 2.0,最初,我希望将两个纹理附件连接到一个FBO,但我在OpenGL ES 2.0中看到不支持GL_颜色_ATTACHMENT0(仅支持GL_颜色_ATTACHMENT0)。但是,为了查看使用相同GL_COLOR_ATTACHMENT0的2个纹理附件会发生什么,我只能看到第二个纹理的内容可见 然后,我认为有多个FBO具有各自的纹理。但我仍然只看到第二个纹理(附加到第二个FBO) 完整的代码可以在-中看到,我首先尝试将纹理-1绘制到纹理-2(FBO2)上,然后在纹理-2中添加所需的新内容。我什么都能画。

最初,我希望将两个纹理附件连接到一个FBO,但我在OpenGL ES 2.0中看到不支持GL_颜色_ATTACHMENT0(仅支持GL_颜色_ATTACHMENT0)。但是,为了查看使用相同GL_COLOR_ATTACHMENT0的2个纹理附件会发生什么,我只能看到第二个纹理的内容可见

然后,我认为有多个FBO具有各自的纹理。但我仍然只看到第二个纹理(附加到第二个FBO)


完整的代码可以在-

中看到,我首先尝试将纹理-1绘制到纹理-2(FBO2)上,然后在纹理-2中添加所需的新内容。我什么都能画。这是正确的方法吗?“但我仍然只看到第二个纹理(附加到第二个FBO)。”-当您绘制第二个纹理时,该纹理覆盖了使用纹理1绘制的所有内容(之前绘制的所有内容都被覆盖)。绘制纹理2时,必须启用混合。或者,您可以实现一个混合纹理1和纹理2的着色器。@Rabbid76,是的,混合有帮助。伟大的此外,它不需要3个固定基地运营商。我试着只有一个FBO和3个纹理;能够用混合渲染所有3个纹理。嗨@rabbi76,我想有可能创建一个更小尺寸的纹理(比如说300 x 100)?我正在尝试创建更小尺寸的纹理glTexImage2D(…,300,100,…);为此,我还将视口设置为glViewport(100100300100);。最后,我希望在默认帧缓冲区的特定位置渲染此纹理。注意,我将视口设置回了完整大小。这是一种正确的方法吗?
GLuint fbo;
  glGenFramebuffers(1, &fbo);
  glBindFramebuffer(GL_FRAMEBUFFER, fbo);

  GLuint texture;
  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture, 0);
  glBindTexture(GL_TEXTURE_2D, 0);

  GLenum status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  if (status != GL_FRAMEBUFFER_COMPLETE) {
    printf("Problem with OpenGL framebuffer : %x\n", status);
  }

  glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // This is needed
  DrawRect();

  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  RenderTexture("-- Hello texture 1");
  glDisable(GL_BLEND);
  glBindTexture(GL_TEXTURE_2D, 0);

  GLuint fbo2;
  glGenFramebuffers(1, &fbo2);
  glBindFramebuffer(GL_FRAMEBUFFER, fbo2);

  GLuint texture2;
  glGenTextures(1, &texture2);
  glBindTexture(GL_TEXTURE_2D, texture2);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1920, 1080, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texture2, 0);
  glBindTexture(GL_TEXTURE_2D, 0);

  status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
  if (status != GL_FRAMEBUFFER_COMPLETE) {
    printf("Problem with OpenGL framebuffer2 : %x\n", status);
  }

  glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // This is needed
  glEnable(GL_BLEND);
  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  RenderTexture(" & texture 2 -- ");
  glDisable(GL_BLEND);
  glBindTexture(GL_TEXTURE_2D, 0);

  glBindFramebuffer(GL_FRAMEBUFFER, 0);
  glBindTexture(GL_TEXTURE_2D, texture);
  render_fboTexture();
  glBindTexture(GL_TEXTURE_2D, texture2);
  render_fboTexture();
  glBindTexture(GL_TEXTURE_2D, 0);

  eglSwapBuffers(egldisplay, eglsurface);