1

ネイティブ関数呼び出し内で OpenglES を使用してすべてを描画する EGL コンテキストを作成しようとしています。問題は、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;
}

ご協力いただきありがとうございます

4

1 に答える 1

2

サーフェスは、要求された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); ネイティブアクティビティで同等のことを行うには、次のようなことを行う必要があります。

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,
};

お役に立てれば。私はこの質問を周りで見ました、そして私はちょうどそれを理解しました。

于 2012-07-27T05:54:14.930 に答える