2014-12-26 48 views
0

我想在C++中使用NDK實現openGL ES 2.0遊戲。我的測試設備是華碩Zenphone 5 我很確定它支持openGL ES 2.0,因爲它可以非常流暢地運行基於OpenGL ES 2的遊戲,並且還可以非常流暢地運行遊戲中的helloGl2樣本。Android NDK C++ openGL ES 2上下文給出不好的顯示

當我打電話給glCreateShader時,log cat發出了一個錯誤,名爲「未實現的api」,我發現這是因爲應用程序默認使用了openGL ES 1上下文。

所以我修改了EGL上下文創建代碼:

context = eglCreateContext(display, config, NULL, NULL); 

EGLint contextAttrs[] = { 
     EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE 
}; 

context = eglCreateContext(display, config, NULL, contextAttrs); 

現在,這給了一個不同的錯誤

E/libEGL(12670): validate_display:257 error 3008 (EGL_BAD_DISPLAY) 

然而,當我測試的一個星系s3(GT-I9100)沒有BAD DISPLAY ERROR,但應用程序在致命信號SI調用glCreateShader時崩潰GSEV

這是怎麼回事?

+0

你如何設置'display'的值?您可能還想顯示'config'選擇代碼。即使錯誤確實表明問題出在顯示器上。 –

+0

是的,抱歉,我剛剛意識到我應該發佈顯示代碼,因爲最終的問題證明是在eglchooseconfig屬性(EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT)中,無論如何感謝輸入 – Allahjane

回答

2

如果要創建ES 2上下文,還需要將EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT包括在EGL配置的屬性中,但僅將EGL_CONTEXT_CLIENT_VERSION, 2添加到上下文屬性是不夠的。

此外,請確保您鏈接到libGLESv2.so(-lGLESv2LOCAL_LDLIBS),並確保您沒有意外鏈接libGLESv1_CM.so。 (在相同的過程中使用它們需要一些額外的詭計。)

+0

Oye真棒的人!那就是訣竅!我不得不添加EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT和bam所有錯誤消失 – Allahjane

+0

什麼樣的例子是,這與GLESv2鏈接,但只使用GLES 1 APIs(並使用EGL建立一個GLES 1上下文,我猜)?當我在NDK示例目錄中爲GLESv2 grepp時,我沒有發現任何沒有正確標記的示例。 – mstorsjo

+0

如果您的意思是NDK中的'native-activity'樣本,則它只鏈接到GLESv1_CM。 – mstorsjo