Mar*_*ram 6 shader android native opengl-es-2.0
我已经调整了本机活动NDK示例以合并来自hello-gl2示例的OpenGL代码.我处理APP_CMD_INIT_WINDOW消息然后尝试创建着色器.着色器创建失败,我尝试通过getShaderInfoiv获取信息,但是它也会无声地失败.
所以我的问题是 - 如何在纯原生Android应用程序中创建OpenGL ES 2.0着色器?
PS我知道如果使用Java GLSurfaceView并且不在正确的线程中创建它们,则着色器创建可能会失败,但是查看本机活动示例,它似乎只有一个线程!
you*_*uri 12
当然可以在原生Android应用程序中创建OpenGL ES 2.0着色器.关键是要使用适当的OpenGL ES 2.0上下文.我在我的应用程序中做了类似的事情,即在本机部分初始化EGL上下文,然后仅在本机代码中创建(和使用)着色器.根据我设法做的事情,我假设你想要做的事情也是完全可能的.
由于我在Java代码中有一个入口点(没有使用NativeAcvity机制),我还必须将原生窗口句柄(EGLNativeWindowType)从java传递给C++,以便在本机代码中创建EGL表面.但是,由于您只想修改NativeActivity示例,因此您可以使用NativeActivity示例engine->app->window中的创建EGL表面main.c.
好的,如何在本机代码中创建适当的OpenGL ES 2.0上下文?我刚刚对main.cNativeActivity示例中的文件进行了两处更改并检查它是否有效.
首先,使用以下EGL属性
const EGLint attribs[] = {
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT, //important
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
Run Code Online (Sandbox Code Playgroud)
在eglChooseConfig(display, attribs, &config, 1, &numConfigs);.
其次,后来在创建上下文时使用
const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
Run Code Online (Sandbox Code Playgroud)
在 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 ... ]
Run Code Online (Sandbox Code Playgroud)
希望能帮助到你!
| 归档时间: |
|
| 查看次数: |
3509 次 |
| 最近记录: |