Android 未在Nexus 5/KitKat 4.4上实现的Opengl ES 3.0着色器函数

Android 未在Nexus 5/KitKat 4.4上实现的Opengl ES 3.0着色器函数,android,opengl-es,shader,android-4.4-kitkat,opengl-es-3.0,Android,Opengl Es,Shader,Android 4.4 Kitkat,Opengl Es 3.0,我在Nexus5W/Kitkat4.4上没有使用任何OpenGL3.0着色器函数,我被称为未实现的OpenGLESAPI函数,例如 glCreateProgram() glShaderSource() glCompileShader() e、 t.c.我在OpenGL上下文处于活动状态时执行所有调用。我无法想象这些功能不会被实现,所以我相信我一定是做错了什么!我已经包括了以下内容 <GLES3/gl3.h> <GLES2/gl2ext.h> <GLES3/gl3p

我在Nexus5W/Kitkat4.4上没有使用任何OpenGL3.0着色器函数,我被称为未实现的OpenGLESAPI函数,例如

glCreateProgram()
glShaderSource()
glCompileShader()
e、 t.c.我在OpenGL上下文处于活动状态时执行所有调用。我无法想象这些功能不会被实现,所以我相信我一定是做错了什么!我已经包括了以下内容

<GLES3/gl3.h>
<GLES2/gl2ext.h>
<GLES3/gl3platform.h>
在我当地的图书馆里。我注意到在EGL/EGL.h中没有EGL_OPENGL_ES3_位,所以在创建上下文时,如果我没有定义EGL_RENDERABLE_类型,或者如果我使用EGL_OPENGL_ES2_位,结果是相同的

关于我的位置的更多信息,以防有所帮助:我正在使用OpenGLES3.0和NDK将我的OpenGL游戏引擎从Windows移植到Android。我的一切编译正常,没有错误,并且已经测试和验证了窗口、GL上下文管理、Android生命周期集成和引擎的基本运行正常。我有一个基本的场景,它只是激活上下文,执行GLClearColor,然后交换缓冲区,每秒从黑色到红色跳动,它的工作原理与在Windows上的工作原理相同


任何帮助都将不胜感激

在使用eglCreateContext时,我还必须使用EGL_CONTEXT_CLIENT_版本:

const EGLint attribs2[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
context = eglCreateContext(displayHandle, config, NULL, attribs2);

事实证明,在使用eglCreateContext时,我还必须使用EGL_CONTEXT_CLIENT_版本:

const EGLint attribs2[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
context = eglCreateContext(displayHandle, config, NULL, attribs2);

似乎您创建的上下文不正确。要在Android中使用OpenGL ES 3.0,您必须创建通常的ES 2.0上下文,然后检查所创建上下文的版本。这就是我在Java代码中使用它的方式,它工作得很好

更多信息:

您似乎没有正确创建上下文。要在Android中使用OpenGL ES 3.0,您必须创建通常的ES 2.0上下文,然后检查所创建上下文的版本。这就是我在Java代码中使用它的方式,它工作得很好

更多信息:
问题中的所有函数都受OpenGL ES 2.0支持

glCreateProgram()
glShaderSource()
glCompileShader()
EGL_CONTEXT_CLIENT_VERSION,2足以清除称为未实现的opengl es api错误。因此,我认为Nexus5上ES的默认版本小于2,这就是问题的原因

const EGLint attribs2[] = 
{
    EGL_CONTEXT_CLIENT_VERSION, 3, // ES 3.x
    // EGL_CONTEXT_CLIENT_VERSION, 2, // if you want to use ES 2.x
    EGL_NONE
};
context = eglCreateContext(displayHandle, config, EGL_NO_CONTEXT, attribs2);
参考文献:

使用EGL_RENDERABLE_类型,我们有EGL_OPENGL_ES3_BIT_KHR,它需要EGL 1.4。 EGL_OPENGL_ES3_BIT_KHR在EGL/eglext.h中定义

包括EGL/eglext.h

#include <EGL/egl.h>
#include <EGL/eglext.h>

#include <GLES3/gl3.h>
GLES3/gl3.h包含在GLES3/gl3.h中。GLES3/gl3.h包含GLES2/gl2.h中的大部分定义

参考:

链接库取决于您想要的ES版本

-lGLESv3
NB1:我们可以省略eglChooseConfig的EGL_RENDERABLE_TYPE属性

EGL_可渲染_类型

位掩码,指示帧中包含哪些类型的客户端API上下文 缓冲区配置必须支持使用eglCreateContext创建 ... 默认值为EGL_OPENGL_ES_位

EGL_OPENGL_ES_位

Config支持创建OpenGL ES 1.0和/或1.1上下文

eglChooseConfig返回的配置的排序规则

EGLConfigs未根据属性进行排序。。。 EGL_一致。。。EGL_可渲染_类型

因此,我认为依赖于ES版本的单独配置是很少见的,但是EGLChoosConfig可能会首先返回一个支持ES 1.0/1.1的配置

参考:

来自eglCreateContext脚注

请求的属性可能无法满足,但需要上下文 创造仍然可能成功

参考:

NB2: 创建ES2.x上下文并不意味着我们可以将其用于ES3.x

我认为设备制造商不想实现EGL和ES版本相关的功能,所以eglCreateContext和EGL_CONTEXT_CLIENT_version,2 可能返回一个可以与ES 3.x一起使用的上下文,但它取决于命运

并非总是如此,但libGLESv3只是libGLESv2的一个符号链接,在一些设备上,在一些安卓版本上。在过去,它是作为一个暂时的bug修复链接的,这给我们带来了许多与版本相关的困惑


如果源代码包含ES 3.x函数,并与libGLESv2链接,链接器将抱怨这些天未定义的引用。

问题中的所有函数都受OpenGL ES 2.0支持

glCreateProgram()
glShaderSource()
glCompileShader()
EGL_CONTEXT_CLIENT_VERSION,2足以清除称为未实现的opengl es api错误。因此,我认为Nexus5上ES的默认版本小于2,这就是问题的原因

const EGLint attribs2[] = 
{
    EGL_CONTEXT_CLIENT_VERSION, 3, // ES 3.x
    // EGL_CONTEXT_CLIENT_VERSION, 2, // if you want to use ES 2.x
    EGL_NONE
};
context = eglCreateContext(displayHandle, config, EGL_NO_CONTEXT, attribs2);
参考文献:

使用EGL_RENDERABLE_类型,我们有EGL_OPENGL_ES3_BIT_KHR,它需要EGL 1.4。 EGL_OPENGL_ES3_BIT_KHR在EGL/eglext.h中定义

包括EGL/eglext.h

#include <EGL/egl.h>
#include <EGL/eglext.h>

#include <GLES3/gl3.h>
GLES3/gl3.h包含在GLES3/gl3.h中。GLES3/gl3.h包含GLES2/gl2.h中的大部分定义

参考:

链接库取决于您想要的ES版本

-lGLESv3
NB1:我们可以省略eglChooseConfig的EGL_RENDERABLE_TYPE属性

EGL_可渲染_类型

位掩码,指示帧中包含哪些类型的客户端API上下文 缓冲区配置必须支持使用eglC创建缓冲区 创建上下文 ... 默认值为EGL_OPENGL_ES_位

EGL_OPENGL_ES_位

Config支持创建OpenGL ES 1.0和/或1.1上下文

eglChooseConfig返回的配置的排序规则

EGLConfigs未根据属性进行排序。。。 EGL_一致。。。EGL_可渲染_类型

因此,我认为依赖于ES版本的单独配置是很少见的,但是EGLChoosConfig可能会首先返回一个支持ES 1.0/1.1的配置

参考:

来自eglCreateContext脚注

请求的属性可能无法满足,但需要上下文 创造仍然可能成功

参考:

NB2: 创建ES2.x上下文并不意味着我们可以将其用于ES3.x

我认为设备制造商不想实现EGL和ES版本相关的功能,所以eglCreateContext和EGL_CONTEXT_CLIENT_version,2 可能返回一个可以与ES 3.x一起使用的上下文,但它取决于命运

并非总是如此,但libGLESv3只是libGLESv2的一个符号链接,在一些设备上,在一些安卓版本上。在过去,它是作为一个暂时的bug修复链接的,这给我们带来了许多与版本相关的困惑


如果源代码线包含ES 3.x函数,并与libGLESv2链接,链接器将抱怨这些天未定义的引用。

我看不出我做错了什么,这是我代码的粘贴。请注意,对于我上面的答案,它是有效的。在接受回答之前,我会等着看你是否认为我在做任何不必要的事情。之前的pastebin将EGL版本打印为OpenGLES版本,哎呀,这是个错误。然而,在Android开发者指南上,它说要按照我目前的方式来做,即在创建上下文时传递属性EGL_CONTEXT_CLIENT_VERSION,即使是在Java中。如果失败,那么设备不支持请求的版本,那么我应该默认为2.0。感谢您指出创建3.0上下文的这种方法。我只是没有这样用过。所以你的答案当然是正确的。我看不出我做错了什么,这是我代码的粘贴。请注意,对于我上面的答案,它是有效的。在接受回答之前,我会等着看你是否认为我在做任何不必要的事情。之前的pastebin将EGL版本打印为OpenGLES版本,哎呀,这是个错误。然而,在Android开发者指南上,它说要按照我目前的方式来做,即在创建上下文时传递属性EGL_CONTEXT_CLIENT_VERSION,即使是在Java中。如果失败,那么设备不支持请求的版本,那么我应该默认为2.0。感谢您指出创建3.0上下文的这种方法。我只是没有这样用过。所以你的答案当然是正确的。