Альтернатива для glBlitFrameBuffer() в OpenGL ES 2.0

Моя программа для Android должна использовать функцию glBlitFrameBuffer() для копирования объекта FrameBuffer. Но функция glBlitFrameBuffer() поддерживается только на устройствах OpenGL ES 3.0+. Я хочу поддерживать устройства OpenGL ES 2.0+.

Существует ли какое-либо решение/альтернатива для этой функции?

Ответ 1

  • Связать текстуру, используемую в качестве вложения для размещения в буфере исходного кадра.
  • Привязать фреймбуфер назначения
  • Нарисуйте полноэкранный квадрат (если вам нужно растянуть или смещать чтение с помощью координат вершин/текс)
  • Получить данные из связанной текстуры в фрейм-шейдере и поместить его в gl_FragColor

Ответ 2

Я создал CopyShader, который просто использует шейдер для копирования из текстуры в фреймбуфер.

private static final String SHADER_VERTEX = ""
      + "attribute vec4 a_Position;\n"
      + "varying highp vec2 v_TexCoordinate;\n"
      + "void main() {\n"
      + "  v_TexCoordinate = a_Position.xy * 0.5 + 0.5;\n"
      + "  gl_Position = a_Position;\n"
      + "}\n";

  private static final String SHADER_FRAGMENT = ""
      + ""
      + "uniform sampler2D u_Texture;\n"
      + "varying highp vec2 v_TexCoordinate;\n"
      + "void main() {\n"
      + "  gl_FragColor = texture2D(u_Texture, v_TexCoordinate);\n"
      + "}\n";

Используйте их как свои шейдеры, а затем просто установите u_Texture текстуру, которую вы хотите скопировать из, и привяжите фреймбуфер, в который хотите записать, и вы должны быть установлены.