2014-07-22 10 views
14

Ho cercato di eseguire codice che utilizza VAO in C++ utilizzando l'NDK di Android e in esecuzione su un emulatore. Mi aspetto di poter utilizzare glDeleteVertexArraysOES, glGenVertexArraysOES e glBindVertexArrayOES.Gli oggetti Array Vertex di OpenGL ES sono supportati in qualsiasi emulatore Android?

ho scoperto che l'emulatore non riesce ad eseguire il codice, anche quando uso OpenGL ES 2 e dinamicamente collegare le estensioni che utilizzano questa soluzione: Are Vertex Array Objects supported in Android OpenGL ES 2.0 using extensions?

ho corse glGetString(GL_EXTENSIONS) su un Nexus 4 emulatore in esecuzione API livello 19, e accelerazione GPU e prende la seguente:

GL_EXT_debug_marker 
GL_OES_EGL_image 
GL_OES_depth24 
GL_OES_depth32 
GL_OES_element_index_uint 
GL_OES_texture_float 
GL_OES_texture_float_linear 
GL_OES_compressed_paletted_texture 
GL_OES_compressed_ETC1_RGB8_texture 
GL_OES_depth_texture 
GL_OES_texture_half_float 
GL_OES_texture_half_float_linear 
GL_OES_packed_depth_stencil 
GL_OES_vertex_half_float 

assumo devo vedere GL_OES_vertex_array_object per utilizzare oggetti array di vertici. Quindi sembra che sia un no-go per quel particolare emulatore.

Sapete se è possibile utilizzare gli oggetti array di vertici in OpenGL ES su qualsiasi emulatore Android esistente (di terze parti o altro)? Se é cosi, come?

+2

Se l'emulatore utilizza GLES con accelerazione hw, dipende dall'effettiva implementazione _ sull'host_ se queste funzionalità sono disponibili o meno. – derhass

+1

Non penso che sia necessariamente vero. Sto eseguendo l'emulatore su un macbook pro della metà del 2014 con NVIDIA GeForce GT 750M 2048 MB e quando ho eseguito glGetString (GL_EXTENSIONS) nell'emulatore, è stato riportato che non supportava le estensioni degli oggetti array di vertici. Quando eseguivo glGetString (GLES20.GL_VERSION) riportava che supportava solo la versione 2.0. Se usasse tutte le funzionalità della GPU dell'host, mi aspetterei che supporti OpenGL ES 3.0, ma credo di non capirlo molto bene. –

+0

Un'applicazione può richiedere una versione specifica di un contesto GLES (più o meno) e se ottiene solo 2.0, tutte le funzionalità successive non sono necessariamente disponibili, anche se la GPU sarebbe in grado di utilizzarle. Se 'glGetString' ha restituito 2.0, hai definitivamente ottenuto 2.0. L'emulatore probabilmente lo ha richiesto. Forse puoi anche cambiarlo in alcune finestre di dialogo delle impostazioni. Ma non ho mai lavorato con gli emulatori andorid prima, quindi non ne ho idea. Inoltre non so come nvidia gestisca le estensioni OES, però. – derhass

risposta

0

Nexus 5 Android 5.1.0 API 22 segnalazioni periferica virtuale di Genymotion solo OpenGL ES versione 2.0 di supporto.

È possibile utilizzare il codice sottostante per verificare il supporto sotto le immagini del sistema futuri e emulatori:

package com.example.opengltest; 

import android.app.Activity; 
import android.app.ActivityManager; 
import android.content.Context; 
import android.content.pm.ConfigurationInfo; 
import android.os.Bundle; 
import android.util.Log; 
import android.widget.Toast; 

public class OpenGLESVersionActivity extends Activity { 

    private static final String TAG = "OpenGLESVersionActivity"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     final ActivityManager activityManager = 
       (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
     final ConfigurationInfo configurationInfo = 
       activityManager.getDeviceConfigurationInfo(); 
     String versionText = "Device Supported OpenGL ES Version = " + configurationInfo.getGlEsVersion(); 
     Toast.makeText(this, versionText, Toast.LENGTH_LONG).show(); 
     Log.d(TAG, versionText); 
    } 

} 

sua da Does the Android emulator support OpenGL ES 3.0?


Necessità di modificare i parametri in emulatore:

1) È necessario t o modifica l'immagine dell'emulatore, vai alla sezione hardware e aggiungi "Emulazione GPU" e impostalo su vero.

2) C'è un bug con l'emulatore tale che questa riga: "booleano finale supportaEs2 = configurationInfo.reqGlEsVersion> = 0 × 20000;" non funziona. Resterà sempre falso. Puoi aggiungere "|| Build.FINGERPRINT.startsWith ("generico") "o semplicemente commentare queste verifiche e supporre che OpenGL ES 2 sia supportato, quando si esegue sull'emulatore.

3) se si blocca con “nessun config trovato”, prova ad aggiungere questa riga prima della chiamata a “setRenderer (...)”: “glSurfaceView.setEGLConfigChooser (8, 8, 8, 8, 16, 0);”

Prova questo.

+0

OpenGL 2.0 può ancora supportare oggetti array vertex se si utilizzano le estensioni. Se ho accesso a OpenGL 2.0 tramite l'emulatore, esiste un modo per utilizzare tali estensioni? Potrebbe essere ancora possibile. –

+0

Ho aggiornato la mia risposta, modificato i parametri se funzionerà per la risposta del marchio, ho trovato molte persone che affrontano questo problema. Li aiuterà. – NovusMobile

+1

Il punto (1) indica che non si capisce la domanda. L'OP sta chiedendo il supporto GL_OES_ * extensions nell'emulatore. Questa risposta al momento non risolve questo problema. –

1

Ufficialmente, questo dovrebbe essere supportato dal tag <d:gl-extensions> nel devices.xml nella directory utente, ma da quello che posso dire da looking around, questa funzionalità è attualmente inattiva. Potrebbe aver funzionato in passato, ma se così fosse, non funzionerebbe più con le ultime versioni di Android Studio & di Android a partire da questa data. (Quindi la mia taglia, dovrebbe esserci una risposta migliore.)

0

Non so quanto sia legata la tua applicazione con la piattaforma Android, ma tu credo che tu possa adattare e testare il tuo motore 3D principale con un emulatore di Adreno, PowerVR o Mali SDK. Accanto alle librerie libEGL e libGLESv2, ci sono anche diversi strumenti complementari disponibili, incluso il debug in tempo reale per OpenGL-ES.

Modifica: VAO sono le funzionalità principali di GLES 3.0. Le funzioni sono alias per glDeleteVertexArray, glGenVertexArrays e glBindVertexArray. Quindi, se un SDK offre supporto per GLES 3.0, supporta OES_VERTEX_ARRAY_OBJECTS.

IMPORTANTE: assicurarsi che il PC supporti OpenGL 3.xo versioni successive, in base ai requisiti dell'SDK.

Sto sviluppando un emulatore per l'API Java OpenGL-ES di Android, utilizzando sopra le librerie SDK. È in una fase molto precoce e potrebbe non essere d'aiuto ora, ma funziona con semplici esempi. Uno dei motivi per sviluppare questo java emulator è il supporto limitato a GLES dagli emulatori del sistema operativo, come Genymotion e altri. Ora posso affidarmi all'SDK nativo dei produttori di GPU. https://github.com/AlessandroBorges/madri-gles

+0

Il problema qui è il supporto dell'emulatore delle estensioni di OpenGL ES ** **, in particolare - in questo caso particolare, OES_VERTEX_ARRAY_OBJECTS. Se riesci a fornire prove certe che gli emulatori Adreno, PowerVR o Mali forniscono questa funzionalità, posso considerarti per la taglia. –

+0

Tranne Google ANGLE, l'SDK afrika di Adreno, Mali e PowerVR supporta l'estensione OES_VERTEX_ARRAY_OBJECTS, incluse le funzioni void BindVertexArrayOES (array uint); DeleteVertexArraysOES (sizein n, const uint * array); void GenVertexArraysOES (sizein, uint * array) e booleano IsVertexArrayOES (array uint); Le debite limitazioni degli emulatori del sistema operativo, come Genymotion, VMBox e altri, non possono fornire tutte le estensioni né la piena capacità Open HOST di OS. Ecco perché abbiamo bisogno di SDK come Adreno, Mali e PowerVR: in generale, gli emulatori del SO hanno un supporto OpenGL-ES limitato. –

+0

Controllare anche http://community.imgtec.com/files/powervr-supported-extensions/. Mostra che PowerVR SDK supporta VAO come estensione per GLES 2.0 e come Core per 3.0. Deve registrarsi –