Я пытаюсь создать контекст EGL, чтобы рисовать все с помощью OpenglES внутри собственного вызова функции. Проблема в том, что мне нужен доступ к экземпляру NativeWindowType, но я мог найти только функцию для ее создания (что я никак не могу узнать, как установить ссылку). Однако, даже если я его создаю, я подозреваю, что это было бы неправильно, так как мне действительно нужен тот, который создается экземпляром SurfaceView, из которого я вызываю эту собственную функцию.
Вот код:
static int egl_init() {
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
EGLint w, h, dummy, format;
EGLint egl_major_version, egl_minor_version;
EGLint numConfigs;
EGLConfig egl_config;
EGLSurface egl_surface;
EGLContext egl_context;
EGLDisplay egl_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
// v--------- This is where I should get the display window
NativeWindowType display_window;
display_window = android_createDisplaySurface();
eglInitialize(egl_display, &egl_major_version, &egl_minor_version);
printf("GL Version: %d.%d\n", egl_major_version, egl_minor_version);
if (!eglChooseConfig(egl_display, attribs, &egl_config, 1, &numConfigs))
{
printf("eglChooseConfig failed\n");
if (egl_context == 0) printf("Error code: %x\n", eglGetError());
}
eglGetConfigAttrib(egl_display, egl_config, EGL_NATIVE_VISUAL_ID, &format);
// v---------- This requires that I link libandroid, it is found in android/native_window.h
ANativeWindow_setBuffersGeometry(display_window, 0, 0, format);
egl_context = eglCreateContext(egl_display, egl_config, EGL_NO_CONTEXT, NULL);
if (egl_context == 0) LOGE("Error code: %x\n", eglGetError());
egl_surface = eglCreateWindowSurface(egl_display, egl_config, display_window, NULL);
if (egl_surface == 0) LOGE("Error code: %x\n", eglGetError());
if (eglMakeCurrent(egl_display, egl_surface, egl_surface, egl_context) == EGL_FALSE) {
LOGE("Unable to eglMakeCurrent");
return -1;
}
return 0;
}
Спасибо за вашу помощь
Поверхность не может поддерживать запрошенную конфигурацию egl (красный, зеленый и синий не менее 8 бит).
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
В некоторых телефонах по умолчанию используются все поверхностные буферы RGB_565.
В Java для получения более подробных цветов или альфы вы можете getWindow и setFormat(). Например: getWindow(). SetFormat (PixelFormat.TRANSLUCENT); Чтобы сделать что-то эквивалентное в native-activity, вы должны сделать что-то вроде следующего.
ANativeWindow_setBuffersGeometry(display_window, 0, 0, 1);
как определено в android/native_window.h
/*
* Pixel formats that a window can use.
*/
enum {
WINDOW_FORMAT_RGBA_8888 = 1,
WINDOW_FORMAT_RGBX_8888 = 2,
WINDOW_FORMAT_RGB_565 = 4,
};
Надеюсь это поможет. Я видел этот вопрос, и я просто понял это.