Android 在NativeActivity中创建OpenGL着色器

Android 在NativeActivity中创建OpenGL着色器,android,native,opengl-es-2.0,shader,Android,Native,Opengl Es 2.0,Shader,我已经调整了原生活动NDK示例,以合并hello-gl2示例中的OpenGL代码。我处理APP\u CMD\u INIT\u窗口消息,然后尝试创建着色器。着色器创建失败,我尝试通过getShaderInfoiv获取信息,但也会以静默方式失败 所以我的问题是-如何在纯原生Android应用程序中创建OpenGL ES 2.0着色器 另外,我知道如果您使用Java GLSURFACHEVIEW并且没有在正确的线程中创建着色器,那么着色器创建可能会失败,但是查看本机活动示例,它似乎只有一个线程 我想知

我已经调整了原生活动NDK示例,以合并hello-gl2示例中的OpenGL代码。我处理
APP\u CMD\u INIT\u窗口
消息,然后尝试创建着色器。着色器创建失败,我尝试通过getShaderInfoiv获取信息,但也会以静默方式失败

所以我的问题是-如何在纯原生Android应用程序中创建OpenGL ES 2.0着色器


另外,我知道如果您使用Java GLSURFACHEVIEW并且没有在正确的线程中创建着色器,那么着色器创建可能会失败,但是查看本机活动示例,它似乎只有一个线程

我想知道为什么您决定使用完整的本机解决方案,通常您所做的是只保留“本机”您的“重组件”,如渲染引擎、AI引擎、物理引擎,并且您将“设备层”保留到Java部分

这样一来,最大的优势就是可移植性。如果你在NDK中构建所有东西,那么如果你想将游戏/程序移动到Iphone上,你就必须重新发明轮子,而如果你保持C语言的“核心”和Java语言的附加层,你只需要重写问题的简单部分

在这类解决方案中,我拥有丰富的经验,因为我的3D引擎(PATRIA 3D)是基于本机代码构建的,可以从Android NDK交叉移植到Iphone Objective C(加上Windows/Linux/Mac OSx)。最终,我的代码是一个完全兼容的C89+OpenGL2.0,可以在Android(使用Android ndk构建)和Iphone(XCODE)上直接编译(稍作修改)

按照这种方法,引擎将在同一个线程上执行实际绘图,我称之为主线程

如果应用程序中需要多线程:

A-将图纸保留在主图纸上(主图纸) B-用Java创建新线程,不要用C(当你移植到其他平台时,你在新层上构建多线程)

对于着色器,这种方法的解决方案非常简单,因为OpenGL的曲面和初始化是由Java使用标准EGL库执行的

相信我,如果你能在Android和Iphone这两个平台上写一次并使用,你的“客户”数量就会翻倍,这是你不能忽视的,它可能会让你的收入翻倍


我希望这在某种程度上有所帮助。

在原生Android应用程序中创建OpenGL ES 2.0着色器当然是可能的。关键是使用合适的OpenGL ES 2.0上下文。我在我的应用程序中做了类似的事情,即在本机部分初始化EGL上下文,然后仅在本机代码中创建(并使用)着色器。根据我所做的,我认为你想做的也是完全可能的

<>因为java代码中有一个入口点(没有使用NotoValeActuple机制),所以我必须通过java(EGLNativeWindowType)C++的原生窗口句柄(<代码> < <代码> >),以便在本机代码中创建EGL表。但是,由于您只想修改NativeActivity示例,因此可以使用
engine->app->window
在上创建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, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
eglChooseConfig(显示、属性和配置、1和numconfig)中

其次,在以后的创作语境中使用

const EGLint attrib_list [] = {EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE};
context=eglCreateContext中(显示、配置、空、属性列表)

我没有改变代码的其余部分。我打印了一些信息以确保使用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 ... ]

希望有帮助

对不起,这个可能没用的问题,但是,您是否以某种方式初始化了EGL?我认为中的OpenGL引擎根本没有准备好接收您的请求(这可以解释GetShaderInfo调用的无声失败)。在这种情况下,是否加载了OGL2.0库?由于没有本地OpenGL开发的经验,我猜测下面的本地活动示例将留给您OpenGL ES 1.0上下文。在hello-gl2示例中,OpenGLES2.0配置选择是在Java代码中完成的。是的,这也是我关心的问题。我可能尝试把代码从java移植到C++。谢谢——这正是我所要寻找的。我到家后会检查的。这两个变化很好。谢谢我很高兴能帮上忙!我唯一遗憾的是,我写答案太晚了,没有得到赏金;)这似乎是一篇非常好的帖子,但我不了解线程部分。如果我使用可以使用多线程的c++11,使用完整的本机解决方案可以吗?因为我使用的是带有Java接口的C++个人引擎(我把java java中的所有纹理都放进去),所以它不整洁。