2011-12-23 96 views
0

我正试图获得一个简单的测试应用程序,以使用San Angeles演示作为参考进行构建。目前(在我的native/cpp代码中)我只在调整glize时调用glViewport,在渲染帧时调用glClearColor和glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)。动态加载opengl库时会发生问题(通过dlopen(“libGLESv1_CM.so”,RTLD_NOW)); dl打开成功,我找到了符号,但屏幕仍然保持黑色,即使我已将清晰的颜色设置为绿色。另一方面,如果我不导入符号,事情似乎很好。Android:使用NDK进行OpenGL渲染

我已经经历了几次现在的San Angeles演示,看不到我可能错过了什么。任何想法/建议非常感谢。我的进口代码如下:

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

回答

1

您确定您正确定义了ponters吗? (我指的是如何将参数传递给函数的方法)

例如,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

我还没有尝试从本地代码自己创建GLES上下文,我只是让Android做到这一点,然后本地进行渲染。

您是否检查过您的环境正在工作? 也许您应该致电eglGetError()和/或glGetError()以查看是否有任何问题。