android – 在NativeActivity中创建OpenGL着色器

前端之家收集整理的这篇文章主要介绍了android – 在NativeActivity中创建OpenGL着色器前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经调整了本机活动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 ... ]

希望能帮助到你!

猜你在找的Android相关文章