Собственная активность Android NDK Треугольник OpenGL ES 1.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);
}

Кто-нибудь может помочь?

Все, что я могу видеть розовый / фиолетовый фон, но знаю любой другой пиксель: | Нет ошибок в консоли.

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.

1

Другие решения

Сегодня у меня была такая же проблема в течение многих часов, и, наконец, я нашел ответ. Это не ошибка в вашем коде, но, скорее всего, на тестирующем устройстве.

Во-первых: вы работаете с виртуальным устройством 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, возвращаясь к значению по умолчанию» (см. Справку по адресу: https://developer.amazon.com/sdk/fire/enable-features.html#GPU).

Теперь, если вы используете физический мобильный телефон, я только что прочитал, что некоторые мобильные телефоны, кажется, не поддерживают egl, в основном некоторые с CyanogenMod (они отображают аналогичную ошибку в logcat). В этом случае вам следует проверить его на другом телефоне или AVD с указанными выше характеристиками.

0

По вопросам рекламы [email protected]