web-dev-qa-db-fra.com

Existe-t-il un moyen de vérifier si Android prend en charge openGL ES 2.0?

Je dois vérifier dynamiquement si le périphérique utilisé prend en charge openGL ES 2.0. Comment puis je faire ça?

25
Erik Sapir

Oui. Le code suivant fera l'affaire:

final ActivityManager activityManager = 
    (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
final ConfigurationInfo configurationInfo = 
    activityManager.getDeviceConfigurationInfo();
final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;

Lisez ceci pour plus d'informations: http://www.learnopengles.com/Android-lesson-one-getting-started/

Vous pouvez également exiger que les appareils qui ne prennent pas en charge 2.0 ne voient pas votre application sur le marché en ajoutant les éléments suivants à votre manifeste:

<uses-feature Android:glEsVersion="0x00020000" Android:required="true" />

Voir aussi le doc de uses-feature .

36
Foggzie

En plus d'archiver le code de la manière que d'autres ont mentionnée, si vous souhaitez le restituer sur le marché UNIQUEMENT aux appareils avec 2.0, alors en manifeste:

    <uses-feature Android:glEsVersion="0x00020000" Android:required="true" />

Vous devriez faire les deux, j'ai demandé à des gens d'installer l'apk directement sur des appareils inappropriés et j'ai dû faire face à d'étranges exceptions. Maintenant, je lance un runTime:

private boolean detectOpenGLES20() {
        ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
        ConfigurationInfo info = am.getDeviceConfigurationInfo();
        return (info.reqGlEsVersion >= 0x20000);
    }

      //in activity onCreate    
    if (!detectOpenGLES20()) {
        throw new RuntimeException("Open GL ES 2.0 was not found on device");
    }
5
weston

Vous pouvez utiliser ce code dans votre code:

            int result;
            ActivityManager activityManager =
                    (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
            ConfigurationInfo configInfo = activityManager.getDeviceConfigurationInfo();
            if (configInfo.reqGlEsVersion != ConfigurationInfo.GL_ES_VERSION_UNDEFINED) {
                result= configInfo.reqGlEsVersion;
            } else {
                result= 1 << 16; // Lack of property means OpenGL ES version 1
            }

            Log.e("reqGlEsVersion", String.valueOf(result));
            Log.e("getGlEsVersion", configInfo.getGlEsVersion());
2
Dario Brux

Détermination des extensions OpenGL:

Les implémentations d'OpenGL varient selon Android en termes d'extensions de l'API OpenGL ES qui sont prises en charge. Ces extensions incluent des compressions de texture, mais incluent généralement également d'autres extensions du jeu de fonctionnalités OpenGL.

Pour déterminer quels formats de compression de texture et autres extensions OpenGL sont pris en charge sur un périphérique particulier:

Exécutez le code suivant sur vos appareils cibles pour déterminer les formats de compression de texture pris en charge:

  String extensions = javax.microedition.khronos.opengles.GL10.glGetString(GL10.GL_EXTENSIONS);

Avertissement: les résultats de cet appel varient selon l'appareil! Vous devez exécuter cet appel sur plusieurs appareils cibles pour déterminer quels types de compression sont généralement pris en charge. Examinez la sortie de cette méthode pour déterminer quelles extensions OpenGL sont prises en charge sur le périphérique.

2
iSun

Jamais utilisé OpenGL ES, mais vu qu'il a la même méthode glGetString qu'OpenGL. Cela devrait faire l'affaire:

http://www.khronos.org/opengles/sdk/docs/man/xhtml/glGetString.xml

0
ssell

Ce code fonctionne bien ..

     // Check if the system supports OpenGL ES 2.0.
final ActivityManager activityManager = ActivityManager)getSystemService(Context.ACTIVITY_SERVICE);
    final ConfigurationInfo configurationInfo = activityManager
            .getDeviceConfigurationInfo();
    final boolean supportsEs2 = configurationInfo.reqGlEsVersion >= 0x20000;

    if (supportsEs2) {
        Log.i("JO", "configurationInfo.reqGlEsVersion:"
                + configurationInfo.reqGlEsVersion + "supportsEs2:"
                + supportsEs2);
        // Request an OpenGL ES 2.0 compatible context.
        myGlsurfaceView.setEGLContextClientVersion(2);

        final DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);

        // Set the renderer to our demo renderer, defined below.
        myRenderer = new MyRenderer(this, myGlsurfaceView);
            } else {
        // This is where you could create an OpenGL ES 1.x compatible
        // renderer if you wanted to support both ES 1 and ES 2.
        return;
    }
0
harikrishnan

Depuis un moment, je cherche la même réponse aussi. Mais malheureusement, je n'ai pas pu trouver une description appropriée pour cela. Je viens de trouver un moyen il y a une minute par moi-même, et j'ai l'impression que j'aimerais le partager avec tout le monde.

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FeatureInfo[] list = this.getPackageManager()
            .getSystemAvailableFeatures();

    Toast.makeText(this,
            "OpenGL ES Version: " + list[list.length - 1].getGlEsVersion(),
            Toast.LENGTH_LONG).show();
}
0
Kogal