【问题标题】:setEGLContextClientVersion(3) on Android Studio causing errorAndroid Studio 上的 setEGLContextClientVersion(3) 导致错误
【发布时间】:2016-09-02 04:18:27
【问题描述】:

我一直在使用 Android Studio 2.1.3 和 Java Dev Kit 1.8.0 以及 API 24 (Android 7.0 Nougat) 上的 SDK 版本来跟踪 Android OpenGL tutorial,但我无法通过setEGLContextClientVersion(3) 将OpenGL ES 上下文# 设置为3.0。

这样做会产生以下结果:

09-01 11:02:46.526 6822-6839/? E/AndroidRuntime:致命异常: GL线程 149 进程:com.example.opengl,PID:6822 java.lang.IllegalArgumentException: eglChooseConfig 失败 在 android.opengl.GLSurfaceView$BaseConfigChooser.chooseConfig(GLSurfaceView.java:852) 在 android.opengl.GLSurfaceView$EglHelper.start(GLSurfaceView.java:1023) 在 android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1400) 在 android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1239)

使用setEGLContextClientVersion(2) 可以完美地显示所需的形状。在尝试setEGLContextClientVersion(3) 时,我尝试在TriangleSquare.java 文件中调整我的着色器以匹配3.0,但无济于事。

我也尝试过使用setEGLConfigChooser(8, 8, 8, 8, 16, 4) 来解决类似的错误。

我还尝试重新启动 Android Studio 和我的模拟器,它们是 Android TV(1080p) API 24、Android TV(1080p) API 22 和 Galaxy Nexus API 22。

下面是我的 MyGLSurfaceView.java 代码 - 同样,如果我将 setEGLContextClientVersion(3) 调整为 (2),一切都会按预期运行。

package com.example.opengl;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;

class MyGLSurfaceView extends GLSurfaceView {

private final MyGLRenderer mRenderer;

public MyGLSurfaceView(Context context) {
    super(context);

    //Create an OpenGL ES # context
    setEGLContextClientVersion(3);
    setEGLConfigChooser(8 , 8, 8, 8, 16, 4);

    mRenderer = new MyGLRenderer();
    setRenderer(mRenderer);
}

private final float TOUCH_SCALE_FACTOR = 180.0f / 320;
private float mPreviousX;
private float mPreviousY;

@Override
public boolean onTouchEvent(MotionEvent e){
    //MotionEvent reports input details from the touch screen
    // and other input controls. In this case, you are only
    // interested in events where the touch position changed.

    float x = e.getX();
    float y = e.getY();

    switch(e.getAction()) {
        case MotionEvent.ACTION_MOVE:

            float dx = x - mPreviousX;
            float dy = y - mPreviousY;

            //reverse direction of rotation above the mid-line
            if(y > getHeight()/2) {
                dx = dx * -1;
            }

            //reverse direction of rotation to left of the mid-lin
            if(x<getWidth()/2) {
                dy=dy * -1;
            }

            mRenderer.setAngle(mRenderer.getAngle()+((dx+dy)*TOUCH_SCALE_FACTOR)); // = 180.0f / 320
            requestRender();
    }

    mPreviousX = x;
    mPreviousY = y;
    return true;
    }
}

还值得注意的是,我的Manifest 中有android:glEsVersion="0x00030000",对于需要GLES30/20 的文件有import android.opengl.GLES30,只要设置了(2),一切都会顺利运行。

如果我应该添加任何其他代码或信息,请告诉我。

【问题讨论】:

    标签: java android android-studio opengl-es


    【解决方案1】:

    有时,您正在开发或运行该应用程序的手机不支持 OpenGLES 版本 3。检查这一点的一种方法是首先使用 OpenGLES 2,然后查看是否有错误。那么如果能运行,说明你的手机不支持OpenGLES 3

    【讨论】:

    • 我认为是这种情况所以我尝试了多个模拟器,我认为所有这些都应该是 3 兼容的,它们都表现出相同的行为
    • 你尝试过哪些模拟器......也请检查这个问题stackoverflow.com/questions/24874066/…
    • 我正在使用 Android TV(1080p) API 24、Android TV(1080p) API 22 和 Galaxy Nexus API 22。根据开发人员图形指南,我认为 API 18+ 支持 OpenGLES3:@ 987654322@。从附加的链接看来,模拟器可能还不够 :( 。感谢我可以遵循的观点!
    猜你喜欢
    • 2021-11-11
    • 2013-11-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-30
    • 2018-04-19
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多