2013-07-27 4 views
2

최근 Android NDK r9가 OpenGL ES 3.0 지원을 발표했습니다. JNI/네이티브 코드에서 OpenGL ES 3.0을 사용하는 방법을 보여주는 예제는 samples/gles3jni입니다.Android에서 OpenGL ES 3.0 NDK r9

  • API 레벨 11과 호환 나중에
  • 이 필요 API 레벨 18 이상 : 샘플은 두 가지 방법을 구축 할 수 있습니다.

두 버전 모두 OpenGL ES 3.0을 지원하지 않는 장치 용 OpenGL ES 2.0 대체 경로를 포함합니다. 그러나 첫번째 예의 경우는 LOCAL_LDLIBS 옵션 -lGLESv2을 사용하여 OpenGL ES 2에 정적으로 연결됩니다. 두 번째 경우에는 정적으로 GLES 3과 동일한 방식으로 연결됩니다.

초기화는 다음과 같이 진행됩니다

const char* versionStr = (const char*)glGetString(GL_VERSION); 
if (strstr(versionStr, "OpenGL ES 3.") && gl3stubInit()) { 
    g_renderer = createES3Renderer(); 
} else if (strstr(versionStr, "OpenGL ES 2.")) { 
    g_renderer = createES2Renderer(); 
} 

가 어떻게 .so에서 동적으로 모든 부하 GLES 2 또는 3에서 정적 링크를 생략 할 수 있습니다?

+1

태그를 지우려면 다음을 수행하십시오. http://meta.stackexchange.com/questions/190739/opengl-es-3-or-opengl-es-3-0-tag?noredirect=1#comment591924_190739 –

답변

1

필자는 4.3 디바이스를 테스트하지 않았지만 제 1의 방법은 실제로 GLES 3을 사용할 수 있다면 실제로 libGLESv3를 동적으로 링크하는 것과 같습니다.

libglesxx.so와의 동적 링크도 가능하지만 바로 가기가 없으므로 사용하는 모든 기능을 dlsym해야합니다. 그만한 가치는 없습니다.

+1

예, 그렇지만 GLES2를 정적으로 연결합니다. –

+0

GLES2를 정적으로 링크하지만 libGLESv2.so는 v3에 호출을 전달합니다. –

+0

나는 그것을보고 현재하고있다. 그러나 문제는 정적 링크없이 GLES2 대 GLES3을 동적으로 선택하는 것이 었습니다. ''libglesxx.so''에 대한 표준 이름이 있습니까? –

1

API 18 이상에서 eglGetProcAddress를 사용하여 샘플에서 gl3stub.c와 같이 ES 3.0 기능을 동적으로 쿼리 할 수 ​​있습니다. API 18 전에, 당신은 같은 것을 할 필요가 :

// global scope, probably a header file 
extern GL_APICALL const GLubyte* (* GL_APIENTRY glGetString) (GLenum name); 
extern GL_APICALL GLenum (* GL_APIENTRY glGetError) (void); 
... 

// initialization code 
void* libGLESv2 = dlopen("libGLESv2.so", RTLD_GLOBAL | RTLD_NOW); 
glGetString = dlsym(libGLESv2, "glGetString"); 
glGetError = dlsym(libGLESv2, "glGetError"); 
... 

추가는 물론, dlopen을하고 dlsym을 호출에 오류 검사.

왜 이렇게 할 지 모르겠습니다. libGLESv2.so는 타겟팅하려는 Android 버전에 제공되며 링크 대상에 어떤 단점도 있어서는 안됩니다.

관련 문제