Android: рендеринг OpenGL с помощью NDK - PullRequest
0 голосов
/ 23 декабря 2011

Я пытаюсь запустить простое тестовое приложение, которое я создал с использованием демонстрационной версии в Сан-Анджелесе. В настоящее время (в моем родном / cpp-коде) я вызываю только glViewport при изменении размера, а glClearColor и glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) при рендеринге фрейма. Проблемы возникают при динамической загрузке библиотеки opengl (через dlopen ("libGLESv1_CM.so", RTLD_NOW)); dl open успешен, и я нахожу символы, однако экран остается черным, хотя я установил свой чистый цвет на зеленый. С другой стороны, если я не импортирую символы, кажется, что все работает нормально.

Я уже несколько раз проходил демонстрацию в Сан-Анджелесе и не вижу, что я мог пропустить. Любые идеи / советы очень ценятся. Мой код импорта ниже:

uint32 ImportOpenGL()
{
    uint32 uResult = 0;

    glesLib = dlopen("libGLESv1_CM.so", RTLD_NOW);

    if (!glesLib)
        return 1;

#define GL_IMPORT_FUNC(funcName)                                                    \
    {                                                                               \
        *((void **)&(funcPtr_##funcName)) = (void *)dlsym(glesLib, #funcName);  \
        if(!funcPtr_##funcName)                                                     \
        {                                                                           \
            LOGW("Could not load OpenGL symbol: %s", #funcName);                    \
            uResult = (!uResult ? 2 : uResult);                                     \
        }                                                                           \
    }

    GL_IMPORT_FUNC(glBlendFunc);
    GL_IMPORT_FUNC(glClear);
    GL_IMPORT_FUNC(glClearColorx);
    GL_IMPORT_FUNC(glClearColor);
    GL_IMPORT_FUNC(glColor4x);
    GL_IMPORT_FUNC(glColorPointer);
    GL_IMPORT_FUNC(glDisable);
    GL_IMPORT_FUNC(glDisableClientState);
    GL_IMPORT_FUNC(glDrawArrays);
    GL_IMPORT_FUNC(glEnable);
    GL_IMPORT_FUNC(glEnableClientState);
    GL_IMPORT_FUNC(glFrustumx);
    GL_IMPORT_FUNC(glGetError);
    GL_IMPORT_FUNC(glLightxv);
    GL_IMPORT_FUNC(glLoadIdentity);
    GL_IMPORT_FUNC(glMaterialx);
    GL_IMPORT_FUNC(glMaterialxv);
    GL_IMPORT_FUNC(glMatrixMode);
    GL_IMPORT_FUNC(glMultMatrixx);
    GL_IMPORT_FUNC(glNormalPointer);
    GL_IMPORT_FUNC(glPopMatrix);
    GL_IMPORT_FUNC(glPushMatrix);
    GL_IMPORT_FUNC(glRotatex);
    GL_IMPORT_FUNC(glScalex);
    GL_IMPORT_FUNC(glShadeModel);
    GL_IMPORT_FUNC(glTranslatex);
    GL_IMPORT_FUNC(glVertexPointer);
    GL_IMPORT_FUNC(glViewport);

#undef GL_IMPORT_FUNC

    if(!uResult)
    {
        LOGI("Successfully imported OpenGL symbols");
    }

    return uResult;
}

Ответы [ 2 ]

1 голос
/ 23 декабря 2011

Вы уверены, что правильно определили понтеров?(я имею в виду метод, которым аргументы передаются в функцию)

Например, glEnable определяется следующим образом:

GL_API void GL_APIENTRY glEnable (GLenum cap);

, где GL_API - KHRONOS_APICALL:

#if defined(_WIN32) && !defined(__SCITECH_SNAP__)
#   define KHRONOS_APICALL __declspec(dllimport)
#elif defined (__SYMBIAN32__)
#   define KHRONOS_APICALL IMPORT_C
#elif defined(__ANDROID__)
#   define KHRONOS_APICALL __attribute__((visibility("default")))
#else
#   define KHRONOS_APICALL
#endif

, а GL_APIENTRY - KHRONOS_APIENTRY:

#if defined(_WIN32) && !defined(_WIN32_WCE) && !defined(__SCITECH_SNAP__)
/* Win32 but not WinCE */
#   define KHRONOS_APIENTRY __stdcall
#else
#   define KHRONOS_APIENTRY
#endif

Таким образом, вы не должны добавлять __stdcall к объявлениям указателя, т.е. функции GLES используют значение по умолчанию__cdecl соглашение (а не __fastcall).

0 голосов
/ 23 декабря 2011

Я сам не пытался создать контекст GLES из нативного кода, я просто позволил Android сделать это, а затем перешел на нативный для рендеринга.

Вы проверили, что ваш контекст работает? Может быть, вам следует позвонить eglGetError() и / или glGetError(), чтобы узнать, что-то не так.

...