gpt4 book ai didi

android - 如何使用 android.opengl.GLES10 对象

转载 作者:行者123 更新时间:2023-11-29 17:48:20 25 4
gpt4 key购买 nike

我正在尝试理解和增强 Android 的 GLTron 端口,所有代码都可以在:https://github.com/flide/android-gltron.git 上找到

现在这里是问题和借口:

Android 开发者指南: http://developer.android.com/guide/topics/graphics/opengl.html它说,我引用 - “android.opengl - 这个包提供了一个静态接口(interface)到 OpenGL ES 1.0/1.1 类和比 javax.microedition.khronos 包接口(interface)更好的性能。”

但是如果我尝试将“onSurfaceCreated(GL10, EGLConfig)”函数中的对象切换到 android.opengl 包的相关对象,当我尝试切换到 android.opengl.EGLConfig 对象而不是使用“javax.microedition.khronos.egl.EGLConfig”:

error: OpenGLView is not abstract and does not override abstract method onSurfaceCreated(GL10,EGLConfig) in Renderer

从 android.opengl 包切换到 GLES10 对象时,我遇到了类似的错误。

我是不是漏掉了什么?如果 GLSurfaceView 类不接受它们,我如何使用 android.opengl 包中的类?

编辑:

好的,我找到了部分答案。对于 android.opengl.GLES10,我需要做的就是使用那个对象,因为整个类由静态函数组成,所以不需要创建或传递对象,不需要任何东西。我仍然不确定 EGLConfig 部分。

最佳答案

javax.microedition.khronos.eglandroid.opengl 中具有部分相同名称的相似类确实令人困惑,而且有些不幸。部分基于将这些类添加到 SDK 的 API 级别,我的猜测是它们从 javax 类开始(GL10 标记为 API 级别 1),因为当时可以使用标准接口(interface)来满足他们的需求。后来,他们可能意识到他们需要更多,并开始将它们添加为新类(android.opengl.GLES10 是 API 级别 4)。为了向后兼容,他们保留了旧类。所有这些只是我的解释,我没有任何内幕消息。

您不能在将第一个参数声明为 android.opengl.GLES10 时覆盖 onSurfaceCreated()。虽然它可能具有与 GL10 几乎相同的成员函数,但它们是完全独立的类,因此 Java 会将它们视为不同的类型。因此,如果将参数更改为 GLES10,签名将与您需要重写的基类方法不匹配。

正如您已经根据更新发现的那样,这不是问题。这些类的所有方法都是静态的,因此您不需要实例。您可以简单地忽略 GL10 参数,并使用静态方法的语法进行 OpenGL 调用,其中调用使用类名而不是实例进行限定:

GLES10.glClearColor(...);

或者,如果您使用的是 ES 2.0(强烈推荐,99.9% 的活跃设备都支持):

GLES20.glClearColor(...);

EGLConfig 上,这变得更加有趣。我找到了一个不是特别优雅的解决方案,但这是我能想到的最好的解决方案。基本思想是从旧接口(interface)获取配置的 ID,然后使用新接口(interface)检索具有该 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 类型的配置。

关于android - 如何使用 android.opengl.GLES10 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24831462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com