Untuk menggambar grafik dengan OpenGL ES di aplikasi Android, Anda harus membuat
container-nya. Salah satu cara yang lebih sederhana untuk
melakukannya adalah dengan menerapkan
GLSurfaceView
dan GLSurfaceView.Renderer
. J
GLSurfaceView
adalah container tampilan untuk grafis yang digambar dengan OpenGL dan
GLSurfaceView.Renderer
mengontrol apa yang digambar dalam tampilan tersebut. Untuk informasi lebih lanjut
tentang class ini, lihat panduan OpenGL ES
panduan developer.
GLSurfaceView
hanyalah salah satu cara untuk menggabungkan grafis OpenGL ES ke dalam
aplikasi. Untuk tampilan grafis layar penuh atau mendekati penuh, cara ini merupakan pilihan tepat.
Developer yang ingin menggabungkan grafis OpenGL ES di sebagian kecil tata letak harus
lihat TextureView
. Untuk pengembang {i>DIY<i} sendiri,
itu juga merupakan
tampilan OpenGL ES dapat dibuat menggunakan SurfaceView
, tetapi hal ini memerlukan
menulis cukup banyak
kode tambahan.
Tutorial ini menjelaskan cara menyelesaikan implementasi minimal dari GLSurfaceView
dan GLSurfaceView.Renderer
secara sederhana
aktivitas aplikasi Anda.
Mendeklarasikan penggunaan OpenGL ES dalam manifes
Agar aplikasi Anda dapat menggunakan OpenGL ES 2.0 API, Anda harus menambahkan hal berikut ke manifes:
<uses-feature android:glEsVersion="0x00020000" android:required="true" />
Jika aplikasi Anda menggunakan kompresi tekstur, Anda juga harus mendeklarasikan format kompresi mana yang didukung aplikasi Anda, sehingga hanya diinstal pada perangkat yang kompatibel.
<supports-gl-texture android:name="GL_OES_compressed_ETC1_RGB8_texture" /> <supports-gl-texture android:name="GL_OES_compressed_paletted_texture" />
Untuk informasi selengkapnya tentang format kompresi tekstur, lihat Panduan developer OpenGL.
Membuat aktivitas untuk grafis OpenGL ES
Aplikasi Android yang menggunakan OpenGL ES memiliki aktivitas seperti aplikasi lainnya yang memiliki
antarmuka pengguna. Perbedaan utama dari aplikasi lain adalah apa yang Anda letakkan ke dalam tata letak untuk
aktivitas Anda. Meskipun di banyak aplikasi, Anda mungkin menggunakan TextView
, Button
, dan ListView
, pada aplikasi yang menggunakan OpenGL ES, Anda dapat
juga menambahkan GLSurfaceView
.
Contoh kode berikut menunjukkan implementasi minimal dari aktivitas yang menggunakan
GLSurfaceView
sebagai tampilan utamanya:
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); } }
Catatan: OpenGL ES 2.0 memerlukan Android 2.2 (API Level 8) atau yang lebih tinggi, jadi pastikan proyek Android Anda menargetkan API tersebut atau yang lebih tinggi.
Membuat objek GLSurfaceView
GLSurfaceView
adalah tampilan khusus tempat Anda dapat menggambar OpenGL ES
grafis.
Objek ini tidak melakukan banyak hal sendirian. Penggambaran objek sebenarnya dikontrol di
GLSurfaceView.Renderer
yang Anda tetapkan pada tampilan ini. Bahkan, kode untuk ini
sangat tipis, Anda mungkin tergoda untuk
melewatkannya dan hanya membuat objek
GLSurfaceView
, tetapi jangan lakukan itu. Anda perlu memperluas class ini di
untuk menangkap peristiwa sentuh, yang tercakup dalam fitur Merespons sentuhan
peristiwa.
Kode penting untuk GLSurfaceView
tidak terlalu besar, jadi untuk
adalah hal yang umum untuk
cukup buat inner class di aktivitas yang menggunakannya:
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); } }
Satu tambahan opsional lainnya untuk penerapan GLSurfaceView
adalah menetapkan
mode render untuk hanya menggambar tampilan bila ada perubahan pada data gambar dengan menggunakan
GLSurfaceView.RENDERMODE_WHEN_DIRTY
setelan:
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);
Setelan ini mencegah frame GLSurfaceView
digambar ulang sampai Anda
memanggil requestRender()
, yang lebih
efisien untuk aplikasi contoh ini.
Membuat class perender
Implementasi class GLSurfaceView.Renderer
atau perender,
dalam aplikasi yang menggunakan OpenGL ES adalah titik di mana semuanya mulai menjadi menarik. Kelas ini
kontrol
apa yang digambar di GLSurfaceView
yang terkait. Ada
tiga metode dalam perender yang dipanggil oleh sistem Android untuk mencari tahu apa dan
cara menggambar di GLSurfaceView
:
onSurfaceCreated()
- Dipanggil sekali untuk menyiapkan lingkungan OpenGL ES tampilan.onDrawFrame()
- Dipanggil untuk setiap menggambar ulang tampilan.onSurfaceChanged()
- Dipanggil jika geometri tampilan berubah, misalnya saat orientasi layar perangkat berubah.
Berikut adalah implementasi yang sangat dasar dari perender OpenGL ES, yang tidak melakukan apa pun selain menggambar
latar belakang hitam di 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); } }
Selesai! Contoh kode di atas membuat aplikasi Android sederhana yang menampilkan layar hitam menggunakan OpenGL. Meskipun kode ini tidak melakukan sesuatu yang menarik, dengan membuat kelas-kelas ini, Anda telah meletakkan fondasi yang diperlukan untuk mulai menggambar elemen grafis dengan OpenGL.
Catatan: Anda mungkin bertanya-tanya mengapa metode ini memiliki parameter GL10
, saat Anda menggunakan OpengGL ES 2.0 API.
Tanda tangan metode ini hanya digunakan kembali untuk API 2.0 guna menjaga kode framework Android
lebih mudah.
Jika sudah terbiasa dengan OpenGL ES API, kini Anda seharusnya dapat menyiapkan OpenGL ES di aplikasi Anda dan mulailah menggambar. Namun, jika Anda memerlukan lebih banyak bantuan untuk dimulai dengan OpenGL, lanjutkan ke pelajaran berikutnya untuk mendapatkan lebih banyak petunjuk.