GLSurfaceView – как сделать полупрозрачный фон

Я пытаюсь выполнить рендеринг с использованием GLSurfaceView, а по документам я устанавливаю формат:

getHolder().setFormat(PixelFormat.TRANSLUCENT); 

Я использую GLSurfaceView.Renderer, который рисует inDrawFrame:

 GLES20.glClearColor(0, 0, 1, .5f); GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 

Однако рендеринг GL в GLSurfaceView не является полупрозрачным и полностью синим. Если я опускаю вызов glClear, то он полностью черный.

Как сделать рендеринг GL прозрачным фоном, чтобы он смешивался с просмотренными образами?

Введите описание изображения здесь

EDIT : вот мой GLSurfaceView:

 class GLView extends GLSurfaceView{ MyRenderer r; public GLView(Context ctx){ super(ctx); setEGLContextClientVersion(2); getHolder().setFormat(PixelFormat.TRANSLUCENT); setEGLConfigChooser(8, 8, 8, 8, 16, 0); r = new MyRenderer(getContext()); setRenderer(r); } } 

Хорошо, после некоторых исследований я могу ответить на это сам.

Наконец, я сделал его прозрачным, используя SurfaceView.setZOrderOnTop (true). Но потом я потерял возможность разместить другие взгляды поверх моего GLSurfaceView.

Я закончил с двумя возможными результатами:

занаверху

Слева стандартная поверхность GL ниже всех других видов, которые невозможно нарисовать прозрачностью, потому что поверхность GL нарисована перед поверхностью окна приложения, а GLSurfaceView просто пробивает отверстие в своем местоположении, чтобы поверхность GL просматривалась.

На правой стороне – прозрачная поверхность GL, нарисованная с помощью setZOrderOnTop (true), поэтому ее поверхность рисуется поверх окна приложения. Теперь он прозрачен, но нарисован поверх других представлений, размещенных на нем в иерархии представлений.

Таким образом, кажется, что приложение имеет одно окно с поверхностью для своей иерархии представлений, а SurfaceView имеет собственную поверхность для GL, которая может быть сверху или снизу окна приложения. К сожалению, прозрачный вид GL не может быть упорядочен правильно внутри иерархии представления с другими представлениями поверх него.

Для полупрозрачности вам нужен формат RGBA 8888 пикселей:

 private void init( boolean translucent, int depth, int stencil ) { /* By default, GLSurfaceView() creates a RGB_565 opaque surface. * If we want a translucent one, we should change the surface's * format here, using PixelFormat.TRANSLUCENT for GL Surfaces * is interpreted as any 32-bit surface with alpha by SurfaceFlinger. */ this.getHolder().setFormat( PixelFormat.RGB_565 ); if ( translucent ) { this.getHolder().setFormat( PixelFormat.TRANSLUCENT ); } setEGLContextFactory( new ContextFactory() ); /* We need to choose an EGLConfig that matches the format of * our surface exactly. This is going to be done in our * custom config chooser. See ConfigChooser class definition * below. */ setEGLConfigChooser( translucent ? new ConfigChooser( 8, 8, 8, 8, depth, stencil ) : new ConfigChooser( 5, 6, 5, 0, depth, stencil ) ); setRenderer( new Renderer() ); } 

Вы думали об использовании LayerDrawable с setAlpha? Вот пример, который у меня есть из двух изображений … один прозрачен (по setAlpha), а другой нет. «Calendar_cell» является сплошным и находится на обратной стороне, затем появляется коробка, прозрачная, чтобы показывать за ней ячейку календаря. Таким образом, вы можете складывать столько изображений, сколько хотите, чтобы дать им другую прозрачность.

 Drawable []layers = new Drawable [2]; int imageResource1 = mContext.getResources().getIdentifier("drawable/calendar_cell", null, mContext.getPackageName()); Drawable background = v.getResources().getDrawable(imageResource1); layers [0]= background; int imageResource = mContext.getResources().getIdentifier("drawable/box_" + box, null, mContext.getPackageName()); Drawable boxImg = v.getResources().getDrawable(imageResource); boxImg.setAlpha(100); layers [1]= boxImg; LayerDrawable layerDrawable = new LayerDrawable (layers); v.setBackground(layerDrawable) 

Я не уверен, в чем проблема, но альтернатива может покрывать экран полупрозрачным цветным прямоугольником и просто очищать бит буфера глубины.

Есть ли альтернатива GLES20.glClear (GLES20.GL_COLOR_BUFFER_BIT)?

В противном случае убедитесь, что бит буфера глубины равен 1

Я вернусь позже, чтобы попытаться воссоздать проблему на моем телефоне, когда смогу.

Редактирование : я просто понял, что причина, по которой он выглядит синим, может заключаться в том, что вы установили его в .5f, поэтому требуется всего 2 вызова, чтобы получить полную непрозрачность 1f. А это означает, что он занимает 30 кадров в секунду на 1/15 секунды, чтобы полностью синий.

Попробуйте снизить значение альфа-прозрачности до 0.01f или 0.05f

Intereting Posts
Как получить layout_weight программно? Руководство по реализации PagerSlidingTabStrip Кнопка общего доступа на Android в Qt Quick Как отобразить TextView под другим в Android с XML-файлами? Создание оверлей системы, где домашние кнопки все еще работают? Возможно ли создать ссылку «share on Facebook», которая откроет собственное приложение Facebook на Android / iOS / mobile вместо диалога веб-ресурса? Android. Доступны ли вызовы LogCat для конечных пользователей, если телефон находится в режиме отладки? Список всех видов деятельности в приложении Robojuice / Butterknife @InjectView Проблема автоформации в Android Studio Как получить имена приложений, видимых на главном экране в Android? JWPlayer Javascript API для Android Webview Пожертвования PayPal в приложениях для Android Вставка текста в буфер обмена эмулятора Android с помощью оболочки adb Retrofit2 Android: ожидается BEGIN_ARRAY, но BEGIN_OBJECT в строке 1 столбец 2 путь $ Android WebView: загружает только HTML, не загружает JS или CSS (на некоторых устройствах)