1

私は Android NDK とネイティブ アクティビティを初めて使用します。画面の中央に三角形を作成するのが好きでしたが、どのように試しても表示されません!

これが私の初期化方法です:

void Engine::initialize() {
    LOGI("Engine::initialize fired!");

    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 numConfigs;
    EGLConfig config;
    EGLSurface surface;
    EGLContext context;

    EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    eglInitialize(display, 0, 0);
    eglChooseConfig(display, attribs, &config, 1, &numConfigs);
    eglGetConfigAttrib(display, config, EGL_NATIVE_VISUAL_ID, &format);
    ANativeWindow_setBuffersGeometry(this->app->window, 0, 0, format);

    surface = eglCreateWindowSurface(display, config, this->app->window, NULL);
    context = eglCreateContext(display, config, NULL, NULL);

    if (eglMakeCurrent(display, surface, surface, context) == EGL_FALSE) {
        LOGW("Unable to eglMakeCurrent");
        return;
    }

    eglQuerySurface(display, surface, EGL_WIDTH, &w);
    eglQuerySurface(display, surface, EGL_HEIGHT, &h);

    this->display = display;
    this->context = context;
    this->surface = surface;
    this->width = w;
    this->height = h;

    // Initialize GL state.
    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
    glEnable(GL_CULL_FACE);
    glShadeModel(GL_SMOOTH);
    glDisable(GL_DEPTH_TEST);

    this->animating = true;
}

そして、ここに私のレンダリング方法があります:

  void Engine::onRender() {
    glClearColor(0.7, 0.1, 0.5, 1);
    glClear(GL_COLOR_BUFFER_BIT);

    glViewport(0, 0, this->width, this->height);

    //glMatrixMode(GL_PROJECTION);
    //glLoadIdentity();
    //glFrustumf(-this->width / 2, this->width / 2, -this->height / 2, this->height / 2, 1, 3);

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0, 0, 0);

    GLfloat triangle[] = {
        0, 0, 0,
        0, 100, 0, 
        100, -100, 0
    };

    glPushMatrix();
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glTranslatef(0, 0, 0);
    glColor4f(1.0f, 0.3f, 0.0f, .5f);
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, triangle);
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 3);
    glDisableClientState(GL_VERTEX_ARRAY);
    glPopMatrix();

    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(0, 0, -10);

    eglSwapBuffers(this->display, this->surface);
}

誰でも助けることができますか?

ピンク/紫の背景しか見えませんが、他のピクセルはわかります:| コンソールにエラーはありません。

4

2 に答える 2

1

おそらく OpenGL エラーがありますが、それらは自動的にログに記録されません。そのためにこの関数を使用できます。

static void checkGlError(const char* op) {
    for (GLint error = glGetError(); error; error = glGetError()) {
        LOGI("after %s() glError (0x%x)\n", op, error);
    }
}

各 OpenGL 呼び出しの後に呼び出します。次に、クラッシュする場所を正確に確認します。

その一部として、OpenGL ES 2.0 を使用することをお勧めします。あなたが使用しているすべての呼び出しが ES 1.1 で動作するかどうかは、現時点ではわかりません (他の誰かが確認できるかもしれません)。さらに、あなたとまったく同じように実装している NDK サンプルがありますが、代わりに ES 2.0 を使用しています。ここで見つけることができます:

http://code.google.com/p/android-cmake/source/browse/samples/hello-gl2/jni/gl_code.cpp?r=787b14cf9ed13299cb4c729d9a67d06e300fd52e

シンプルなシェーダーを使用して三角形をペイントし、VBO を使用してレンダリングします。

于 2013-01-14T22:30:39.340 に答える
0

私は今日何時間も同じ問題を抱えていました、そして最終的に答えを見つけました。これはコードのエラーではありませんが、テストデバイスのエラーである可能性があります。

まず、Android仮想デバイスを使用していますか、それとも物理的なモバイルを使用していますか?

最初のケースでは、ADV min API-15を使用し、gpu-emulationをyesに設定する必要があります。または、コマンドラインから、ADVを実行するときに次の行を使用できます。

emulator -avd <avd_name> -gpu on

問題がない場合は、logcatに次の行があります。

D/libEGL  (  595): loaded /system/lib/egl/libGLES_android.so
D/libEGL  (  595): loaded /system/lib/egl/libEGL_emulation.so
D/libEGL  (  595): loaded /system/lib/egl/libGLESv1_CM_emulation.so
D/libEGL  (  595): loaded /system/lib/egl/libGLESv2_emulation.so

それ以外の場合は、最初のものだけが見つかり、「egl.cnfが見つかりません、デフォルトにフォールバックします」などのエラーが見つかる可能性があります(https://developer.amazon.com/sdk/fire/enable-features.htmlでヘルプを見つけました)。 #GPU)。

さて、あなたが物理的な携帯電話を使用している場合、私はちょうどいくつかの携帯電話がeglをサポートしていないようで、主にCyanogenModを使用していることを読みました(それらはlogcatで同様のエラーを表示します)。この場合、他の電話、または上記の仕様のAVDでテストする必要があります。

于 2013-01-16T22:00:34.793 に答える