Per disegnare grafica con OpenGL ES nell'applicazione Android, devi creare un'immagine
visualizzare il container corrispondente. Uno dei modi più semplici per farlo è implementare sia un
GLSurfaceView
e GLSurfaceView.Renderer
. R
GLSurfaceView
è un container di visualizzazione per le grafiche disegnate con OpenGL e
GLSurfaceView.Renderer
controlla gli elementi disegnati all'interno della visualizzazione selezionata. Per ulteriori informazioni
su questi corsi, consulta il documento OpenGL ES
guida per gli sviluppatori.
GLSurfaceView
è solo un modo per incorporare la grafica OpenGL ES nel tuo
un'applicazione. Per una visualizzazione grafica a schermo intero o quasi a schermo intero, è una scelta ragionevole.
Gli sviluppatori che desiderano incorporare la grafica OpenGL ES in una piccola parte dei propri layout devono
dai un'occhiata a TextureView
. Per i veri sviluppatori fai da te, è anche
è possibile creare una vista OpenGL ES utilizzando SurfaceView
, ma questa operazione richiede
un bel po' di codice aggiuntivo.
Questa lezione spiega come completare un'implementazione minima di GLSurfaceView
e GLSurfaceView.Renderer
in una semplice
attività delle applicazioni.
Dichiara l'utilizzo di OpenGL ES nel file manifest
Per consentire alla tua applicazione di utilizzare l'API OpenGL ES 2.0, devi aggiungere quanto segue dichiarazione al file manifest:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
Se l'applicazione utilizza la compressione delle texture, devi anche dichiarare i formati di compressione. supportata dalla tua app, affinché venga installata soltanto su dispositivi compatibili.
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
Per ulteriori informazioni sui formati di compressione delle texture, consulta Guida per gli sviluppatori OpenGL.
Creare un'attività per la grafica OpenGL ES
Le applicazioni Android che utilizzano OpenGL ES hanno attività proprio come qualsiasi altra applicazione che abbia
un'interfaccia utente. La differenza principale rispetto ad altre applicazioni è ciò che inserisci nel layout per il tuo
attività. In molte applicazioni potresti usare TextView
, Button
e ListView
, mentre in un'app che usa OpenGL ES, puoi
aggiungi anche GLSurfaceView
.
L'esempio di codice riportato di seguito mostra un'implementazione minima di un'attività che utilizza un
GLSurfaceView
come vista principale:
Kotlin
class OpenGLES20Activity : Activity() { private lateinit var gLView: GLSurfaceView public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // Create a GLSurfaceView instance and set it // as the ContentView for this Activity. gLView = MyGLSurfaceView(this) setContentView(gLView) } }
Java
public class OpenGLES20Activity extends Activity { private GLSurfaceView gLView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create a GLSurfaceView instance and set it // as the ContentView for this Activity. gLView = new MyGLSurfaceView(this); setContentView(gLView); } }
Nota: OpenGL ES 2.0 richiede Android 2.2 (livello API 8) o versioni successive. quindi assicurati che il tuo progetto Android abbia come target quell'API o una versione successiva.
Crea un oggetto GLSurfaceView
Un GLSurfaceView
è una vista specializzata in cui puoi disegnare OpenGL ES
le immagini.
Non produce molto da solo. Il disegno effettivo degli oggetti è controllato
GLSurfaceView.Renderer
impostata in questa vista. Infatti, il codice
è così sottile che si tende a ignorare l'estensione e si crea
GLSurfaceView
, ma non farlo. Devi ampliare questo corso
per acquisire gli eventi di tocco, come descritto nella sezione Risposta al tocco
eventi.
Il codice essenziale per un GLSurfaceView
è minimo, quindi per una breve
implementazione, è pratica comune
crea una classe interna nell'attività che la utilizza:
Kotlin
import android.content.Context import android.opengl.GLSurfaceView class MyGLSurfaceView(context: Context) : GLSurfaceView(context) { private val renderer: MyGLRenderer init { // Create an OpenGL ES 2.0 context setEGLContextClientVersion(2) renderer = MyGLRenderer() // Set the Renderer for drawing on the GLSurfaceView setRenderer(renderer) } }
Java
import android.content.Context; import android.opengl.GLSurfaceView; class MyGLSurfaceView extends GLSurfaceView { private final MyGLRenderer renderer; public MyGLSurfaceView(Context context){ super(context); // Create an OpenGL ES 2.0 context setEGLContextClientVersion(2); renderer = new MyGLRenderer(); // Set the Renderer for drawing on the GLSurfaceView setRenderer(renderer); } }
Un'altra aggiunta facoltativa all'implementazione di GLSurfaceView
è l'impostazione
la modalità di rendering per disegnare la vista solo quando viene apportata una modifica ai dati del disegno utilizzando il
GLSurfaceView.RENDERMODE_WHEN_DIRTY
dell'impostazione:
Kotlin
// Render the view only when there is a change in the drawing data renderMode = GLSurfaceView.RENDERMODE_WHEN_DIRTY
Java
// Render the view only when there is a change in the drawing data setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);
Questa impostazione impedisce che il frame GLSurfaceView
venga ridisegnato
chiama requestRender()
, che è
efficiente per questa app di esempio.
Creazione di una classe di renderer
L'implementazione della classe o renderer GLSurfaceView.Renderer
all'interno di un'applicazione che usa OpenGL ES è dove le cose iniziano a diventare interessanti. Questo corso
controlli
ciò che viene disegnato in GLSurfaceView
a cui è associato. Esistono
tre metodi in un renderer chiamati dal sistema Android per capire cosa e
come disegnare su un GLSurfaceView
:
onSurfaceCreated()
- Chiamata una volta per impostare l'ambiente OpenGL ES della visualizzazione.onDrawFrame()
- Richiamato per ciascuno ridisegno della vista.onSurfaceChanged()
- Chiamato se la geometria della visualizzazione cambia, ad esempio quando cambia l'orientamento dello schermo del dispositivo.
Di seguito è riportata un'implementazione molto basilare di un renderer OpenGL ES, che non fa altro che disegnare un
sfondo nero in GLSurfaceView
:
Kotlin
import javax.microedition.khronos.egl.EGLConfig import javax.microedition.khronos.opengles.GL10 import android.opengl.GLES20 import android.opengl.GLSurfaceView class MyGLRenderer : GLSurfaceView.Renderer { override fun onSurfaceCreated(unused: GL10, config: EGLConfig) { // Set the background frame color GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f) } override fun onDrawFrame(unused: GL10) { // Redraw background color GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT) } override fun onSurfaceChanged(unused: GL10, width: Int, height: Int) { GLES20.glViewport(0, 0, width, height) } }
Java
import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.opengl.GLES20; import android.opengl.GLSurfaceView; public class MyGLRenderer implements GLSurfaceView.Renderer { public void onSurfaceCreated(GL10 unused, EGLConfig config) { // Set the background frame color GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f); } public void onDrawFrame(GL10 unused) { // Redraw background color GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, height); } }
Questo è tutto. Gli esempi di codice precedenti creano una semplice applicazione per Android che mostra una schermata nera in OpenGL. Anche se questo codice non fa nulla di molto interessante, creando questi corsi, hai gettato le basi per iniziare a disegnare elementi grafici con OpenGL.
Nota: quando utilizzi le API OpengGL ES 2.0, potresti chiederti perché questi metodi hanno un parametro GL10
.
Queste firme dei metodi vengono semplicemente riutilizzate per le API 2.0 al fine di conservare il codice del framework Android
più semplice.
Se hai familiarità con le API OpenGL ES, ora dovresti essere in grado di configurare un protocollo OpenGL ES nell'app e iniziare a tracciare le grafiche. Tuttavia, se hai bisogno di ulteriore assistenza per inizia con OpenGL, passa alle lezioni successive per altri suggerimenti.