我已经调整了本机活动NDK示例以合并来自hello-gl2示例的OpenGL代码.我处理APP_CMD_INIT_WINDOW消息,然后尝试创建着色器.着色器创建失败,我尝试通过getShaderInfoiv获取信息,但是它也会无声地失败.
所以我的问题是 – 如何在纯原生Android应用程序中创建OpenGL ES 2.0着色器?
附:我知道,如果你使用Java GLSurfaceView和不正确的线程创建它们着色器创建可能会失败,但看着本地活动的样品,它只是似乎有一个线程!
解决方法
当然可以在原生Android应用程序中创建OpenGL ES 2.0着色器.关键是要使用适当的OpenGL ES 2.0上下文.我在我的应用程序中做了类似的事情,即在本机部分初始化EGL上下文,然后仅在本机代码中创建(和使用)着色器.根据我设法做的事情,我假设你想要做的事情也是完全可能的.
由于我在Java代码中有一个入口点(没有使用NativeAcvity机制),我还必须将本机窗口句柄(EGLNativeWindowType)从java传递到C,以便在本机代码中创建EGL表面.但是,由于您只想修改NativeActivity示例,因此您可以使用engine-> app->窗口创建EGL表面,如NativeActivity main.c示例中所示.
好的,如何在本机代码中创建适当的OpenGL ES 2.0上下文?我刚刚对NativeActivity示例中的main.c文件进行了两处更改并检查它是否有效.
首先,使用以下EGL属性
const EGLint attribs[] = { EGL_RENDERABLE_TYPE,EGL_OPENGL_ES2_BIT,//important EGL_BLUE_SIZE,8,EGL_GREEN_SIZE,EGL_RED_SIZE,EGL_NONE };
在eglChooseConfig(display,attribs,& config,1,& numConfigs);.
其次,后来在创建上下文时使用
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION,2,EGL_NONE};
in context = eglCreateContext(display,config,NULL,attrib_list);
我保留了其余的代码.我打印了一些信息以确保使用OpenGL ES 2.0:
I/native-activity( 955): Details: [Version: OpenGL ES 2.0 1403843],[Vendor: Qualcomm],[Renderer: Adreno 205],[Extensions: GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture ... ]
希望能帮助到你!