1

我是 Android NDK 和 Native Activity 的新手,我喜欢在屏幕中间创建一个三角形,但无论我如何尝试,我都不会出现!

这是我的初始化方法:

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 not found, fall back to default”之类的错误(在以下位置找到帮助:https ://developer.amazon.com/sdk/fire/enable-features.html #GPU)。

现在,如果您使用的是物理手机,我刚刚读到有些手机似乎不支持 egl,主要是一些带有 CyanogenMod 的手机(它们在 logcat 中显示类似的错误)。在这种情况下,您应该在其他手机或具有上述规格的 AVD 上进行测试。

于 2013-01-16T22:00:34.793 回答