2011-12-23 10 views
0

サンアンヘルズデモを参考にして作成した簡単なテストアプリケーションを作成しようとしています。現在(自分のネイティブ/ cppコードで)、私はフレームをレンダリングするときにglClearColorとglClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)を呼び出すだけです。 OpenGLのlibを動的にロードするときに問題が発生します(dlopen( "libGLESv1_CM.so"、RTLD_NOW))。 dl openが成功し、シンボルを見つけることができますが、クリアカラーを緑色に設定しても、画面は黒色のままです。一方、私がシンボルをインポートしなければ、物事はうまくいくようです。Android:NDKを使ったOpenGLレンダリング

私はサンアンジェルスのデモを数回見てきましたが、私が逃したかもしれないものを見ることはできません。どんなアイデアやアドバイスも大歓迎です。私のインポートコードは以下の通りです:あなたがpontersを正しく定義されていることを確認し

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

ていますか?

GL_APIがKHRONOS_APICALLある
GL_API void GL_APIENTRY glEnable (GLenum cap); 

#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は例えば

(iは引数が関数に渡されるどの方法を意味する)、glEnableは、このように定義されていますKHRONOS_APIENTRY:

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

したがって、は、ポインタ宣言にを追加してはいけません。つまり、GLES関数はデフォルトの__cdeclの規約を使用します(__fastcallではなく)。

0

私は自分自身でネイティブコードからGLESコンテキストを作成しようとしていませんでした。私はAndroidにそれを行い、レンダリングを行うためにネイティブにしましょう。

状況が正常に機能していることを確認しましたか? eglGetError()および/またはglGetError()に電話して何か問題がないかどうかを確認する必要があります。

関連する問題