Альтернатива для 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
текстуру, которую вы хотите скопировать из, и привяжите фреймбуфер, в который хотите записать, и вы должны быть установлены.