Android支持OpenGL ES 2.0吗?

15

Android模拟器支持OpenGL ES 2.0吗?我看到有人说“是的,但你需要更改一些设置。”,也见过“不支持,无论如何都不行。”下面是我尝试解决这个问题所做的事情,包括一些我收到的错误信息。

首先,我修改了AndroidManifest.xml文件以包含以下代码:

<uses-feature 
    android:glEsVersion="0x00020000" />

<uses-sdk
    android:minSdkVersion="15"
    android:targetSdkVersion="17" />

那么,当我想要实例化我的GLSurfaceView时,我使用以下代码序列来实例化它:

super(context);

setEGLContextClientVersion(2);

setRenderer(new MyRenderer());
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

然后,我在各个地方都看到说必须进入AVD Manager,选择模拟器,进入“硬件”,添加“GPU仿真”,并将布尔值设置为“是”。但是,当我查看我的时候,我看到的是这样的:

我的Android 4.2模拟器窗口截图。

奇怪的是,我在AVD Manager中还有另一个模拟器,它确实有“硬件”表:

为什么我的Android 2.2模拟器有硬件表?

为了向您展示我正在做什么,这里有一些代码可以执行我想要在OpenGL ES 2.0中执行的一些操作(我主要是从Android自己的教程中获得的):

int vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vertexShaderCode);
int fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentShaderCode);

program = GLES20.glCreateProgram();
GLES20.glAttachShader(program, vertexShader);
GLES20.glAttachShader(program, fragmentShader);
GLES20.glLinkProgram(program);

我不想修改我的代码以与OpenGL ES 1.0兼容,因为那将需要很多麻烦,如果可以避免,我愿意。

最后,当我尝试运行程序时,程序会关闭并显示窗口:“很抱歉,(应用名称)已停止运行。”这是LogCat告诉我的:

12-05 06:16:27.165: E/AndroidRuntime(936): FATAL EXCEPTION: GLThread 81
12-05 06:16:27.165: E/AndroidRuntime(936): java.lang.IllegalArgumentException: No config chosen
12-05 06:16:27.165: E/AndroidRuntime(936):  at    android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:874)
12-05 06:16:27.165: E/AndroidRuntime(936):  at android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1024)
12-05 06:16:27.165: E/AndroidRuntime(936):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1401)
12-05 06:16:27.165: E/AndroidRuntime(936):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)
3个回答

16
我可以回答你的问题并表示同意。 Android模拟器支持OpenGL ES 2.0。 我使用cocos2d-x v.2创建了一个应用程序(它使用OpenGL ES 2.0)。 我遇到了相同的FATAL EXCEPTION: GLThread 81错误,并且堆栈信息也相同。 我通过添加解决了这个问题。
gLSurfaceView.setEGLConfigChooser(8 , 8, 8, 8, 16, 0);

设置渲染器之前调用 setRenderer:

gLSurfaceView.setCocos2dxRenderer(new Cocos2dxRenderer());

现在我可以在安卓模拟器上运行我的应用程序了。

请查看我在https://dev59.com/oGvXa4cB1Zd3GeqPLacs#13719983上的问题和答案。此链接中的帖子包含具有AVD设置的截图:

http://www.cocos2d-x.org/boards/6/topics/12563?r=19274#message-19274


2
请注意,硬件 GPU 加速仅适用于运行 Android 4.0 及更高版本的 AVD。Android 2.2 版本的 AVD 将无法使用加速的 OpenGL ES 2.0。 - keaukraine
1
我今天会尝试在Android设备上测试这段代码。我想要确保这段代码能够在真实设备上运行。 - Petr
我在Fly设备上测试了这段代码,它可以正常工作。Cocos2d-x论坛上的人提到这段代码只应该在模拟器上运行,而不是在设备上运行。请参考http://www.cocos2d-x.org/boards/6/topics/12563?r=19457#message-19457。 - Petr

5

我在不增加任何新代码的情况下解决了问题。在AVD管理器中,我为我的模拟器设备设置了“使用主机GPU”。现在在我的Geforce GTX 570上完美运行。

模拟器设备的API级别为16,并且清单中的最小SDK为15。


4

我遇到了同样的问题。原始有缺陷的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.d(this.getClass().getName(), "Into onCreate Draw triangle");
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  WindowManager.LayoutParams.FLAG_FULLSCREEN);
    requestWindowFeature(Window.FEATURE_NO_TITLE);

    if (detectOpenGLES20()){
        Log.d("GLES20", "GL ES 2.0 Supported..............!");
    } else {
        Log.d("GLES20", "GL ES 2.0 Not Supported...............!");
    }

    view = new GLSurfaceView(this);
    view.setEGLContextClientVersion(2);
    view.setEGLConfigChooser(true);
    view.setRenderer(new TriangleRenderer(view));
    setContentView(view);
}
解决方案:

a.) 将此行代码替换为:

view.setEGLConfigChooser(true);

使用

view.setEGLConfigChooser(8, 8, 8, 8, 16, 0);


b.) 通过Eclipse设置-gpu on --> 运行 ---> 目标 ---> 附加模拟器命令行选项

在上述讨论中再添加一些内容:
在使用上述代码时,我遇到了两个不同的异常信息

FATAL EXCEPTION: GLThread 75 java.lang.IllegalArgumentException: No configs match configSpec

java.lang.IllegalArgumentException: No config chosen

更详细的案例研究,请参见http://on-android-opengl2.blogspot.in/2013/05/android-opengl-es-20-emulator.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接