Я называю Glreadpixels () внутри очереди, чтобы захватить кадр -буфер после вызова Glfinish () для обеспечения завершения рендеринга.public void captureBitmapAsync(OnBitmapCapturedListener listener) {
queueEvent(() -> {
GLES20.glFinish(); // Ensure all rendering is done
int width = getWidth();
int height = getHeight();
int size = width * height;
ByteBuffer buffer = ByteBuffer.allocateDirect(size * 4);
buffer.order(ByteOrder.nativeOrder());
GLES20.glReadPixels(0, 0, width, height, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, buffer);
int[] data = new int[size];
buffer.asIntBuffer().get(data);
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.setPixels(data, size - width, -width, 0, 0, width, height);
Matrix matrix = new Matrix();
matrix.preScale(1.0f, -1.0f); // Flip vertically
Bitmap correctedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, false);
bitmap.recycle();
post(() -> listener.onBitmapCaptured(correctedBitmap));
});
}
< /code>
обеспечить glfinish () вызывается до glreadpixels (). < /p>
Правильно проверенные предварительные просмотр. Ошибки. Предварительный просмотр рамки от OpenGL и сохраните его в виде изображения, чтобы он появлялся, как показано в предварительном просмотре камеры (не черный)?>
Подробнее здесь: https://stackoverflow.com/questions/796 ... ugh-previe