我正在尝试理解和增强Android的GLTron端口,所有代码都可以在以下位置找到:https://github.com/flide/android-gltron.git
现在这里是一个问题以及借口:
在Android开发人员指南中: http://developer.android.com/guide/topics/graphics/opengl.html 它说和我引用 - " android.opengl - 这个包为OpenGL ES 1.0 / 1.1类提供了一个静态接口,并且比javax.microedition.khronos包接口提供了更好的性能。"
但是,如果我尝试切换" onSurfaceCreated(GL10,EGLConfig)"函数到android.opengl包的相关对象当我尝试切换到android.opengl.EGLConfig对象时,我得到以下错误,而不是使用" javax.microedition.khronos.egl.EGLConfig" :
错误:OpenGLView不是抽象的,并且不会覆盖渲染器中的抽象方法onSurfaceCreated(GL10,EGLConfig)
从android.opengl包切换到GLES10对象时出现类似的错误。
我在这里遗漏了什么吗?如果GLSurfaceView类不接受它们,我如何使用android.opengl包中的类?
编辑:
好的,我找到了部分答案。对于android.opengl.GLES10,我需要做的就是使用该对象,因为整个类由静态函数组成,因此不需要创建或传递对象,因此不需要。我仍然不确定EGLConfig部分。
答案 0 :(得分:3)
在javax.microedition.khronos.egl
和android.opengl
中具有部分相同名称的类似类确实令人困惑,有些不幸。部分基于将这些类添加到SDK的API级别,我的猜测是他们从javax
类开始(GL10
标记为API级别1),因为标准接口可用于什么他们当时需要。然后,他们可能已经意识到他们需要更多,并开始将它们添加为新类(android.opengl.GLES10
是API级别4)。他们保留旧类以实现向后兼容。所有这些只是我的解释,我没有任何内部知识。
在将第一个参数声明为onSurfaceCreated()
时,您无法覆盖android.opengl.GLES10
。虽然它可能与GL10
具有几乎相同的成员函数,但它们是完全独立的类,因此Java会将它们视为不同的类型。因此,如果将参数更改为GLES10
,则签名将与您需要覆盖的基类方法不匹配。
根据您的更新已经发现,这不是问题。这些类上的所有方法都是静态的,因此您不需要实例。您可以简单地忽略GL10
参数,并使用静态方法的语法进行OpenGL调用,其中调用使用类名而不是实例进行限定:
GLES10.glClearColor(...);
或者,如果您正在使用ES 2.0(强烈推荐,并且99.9%的所有常用设备都支持):
GLES20.glClearColor(...);
在EGLConfig
上,这会变得更有趣。我找到了一个不是特别优雅的解决方案,但它是我能想到的最好的解决方案。基本思路是从旧接口获取配置的id,然后使用新接口检索具有该id的配置。
我将这两部分分开,这样我就不必对所有的班级名称进行限定。这部分是使用javax.microedition.khronos.egl
类操作的代码:
EGLConfig config = ...; // your given config
EGLDisplay display = EGL10.eglGetCurrentDisplay();
int valA[] = new int[1];
EGL10.eglGetConfigAttrib(display, config, EGL10.EGL_CONFIG_ID, valA);
int configId = valA[0];
现在configId
是您的配置的ID。此代码现在使用android.opengl
类:
EGLDisplay display = EGL14.eglGetCurrentDisplay();
int[] attribA = {EGL14.EGL_CONFIG_ID, configId, EGL14.EGL_NONE};
EGLConfig[] configA = new EGLConfig[1];
int[] nConfigA[] = new int[1];
EGL14.eglChooseConfig(display, attribA, 0, configA, 0, 1, nConfigA, 0);
EGLConfig newConfig = configA[0];
newConfig
现在是android.opengl.EGLConfig
类型的配置。