what is needed to support open gl 3.2
OpenGL ES
Android menyertakan dukungan untuk grafis second dan 3D performa tinggi dengan Open up Graphics Library (OpenGL®), khususnya, OpenGL ES API. OpenGL adalah API grafis lintas platform yang menentukan antarmuka software standar untuk hardware pemrosesan grafis 3D. OpenGL ES merupakan ragam dari spesifikasi OpenGL yang ditujukan untuk perangkat tersemat. Android mendukung beberapa versi OpenGL ES API:
- OpenGL ES 1.0 dan ane.ane - Spesifikasi API ini didukung oleh Android 1.0 dan yang lebih tinggi.
- OpenGL ES 2.0 - Spesifikasi API ini didukung oleh Android ii.2 (API level 8) dan yang lebih tinggi.
- OpenGL ES three.0 - Spesifikasi API ini didukung oleh Android 4.iii (API level 18) dan yang lebih tinggi.
- OpenGL ES 3.ane - Spesifikasi API ini didukung oleh Android five.0 (API level 21) dan yang lebih tinggi.
Perhatian: Dukungan OpenGL ES 3.0 API di perangkat memerlukan implementasi pipeline grafis ini, yang disediakan oleh produsen perangkat. Perangkat yang menjalankan Android iv.3 atau yang lebih rendah mungkin tidak mendukungOpenGL ES three.0 API. Untuk informasi tentang memeriksa versi OpenGL ES apa yang didukung saat waktu proses, lihat Memeriksa versi OpenGL ES.
Catatan: API spesifik yang disediakan oleh framework Android mirip dengan J2ME JSR239 OpenGL ES API, tetapi tidak identik. Jika Anda sudah terbiasa dengan spesifikasi J2ME JSR239, waspadai variasinya.
Lihat juga
- Menampilkan grafis dengan OpenGL ES
- OpenGL ES
- Spesifikasi OpenGL ES 1.x
- Spesifikasi OpenGL ES 2.x
- Spesifikasi OpenGL ES three.x
Dasar-dasar
Android mendukung OpenGL baik melalui API framework-nya maupun Native Development Kit (NDK). Topik ini berfokus pada antarmuka framework Android. Untuk informasi selengkapnya tentang NDK, lihat Android NDK.
Ada dua form dasar dalam framework Android yang memungkinkan Anda membuat dan memanipulasi grafis dengan OpenGL ES API: GLSurfaceView
dan GLSurfaceView.Renderer
. Jika sasaran Anda adalah menggunakan OpenGL di aplikasi Android, memahami cara menerapkan kedua class ini dalam sebuah aktivitas harus menjadi tujuan pertama Anda.
-
GLSurfaceView
- Class ini adalah
View
tempat Anda dapat menggambar dan memanipulasi objek menggunakan panggilan OpenGL API, dan fungsinya serupa denganSurfaceView
. Anda dapat menggunakan class ini dengan membuat instanceGLSurfaceView
dan menambahkanRenderer
ke instance tersebut. Namun, jika Anda ingin merekam peristiwa layar sentuh, sebaiknya Anda memperluas classGLSurfaceView
untuk mengimplementasikan pemroses sentuhan, seperti ditunjukkan dalam kelas pelatihan OpenGL, Menanggapi peristiwa sentuh. -
GLSurfaceView.Renderer
- Antarmuka ini menentukan metode yang diperlukan untuk menggambar grafis di
GLSurfaceView
. Anda harus menyediakan implementasi antaramuka ini sebagai class terpisah dan menambahkannya ke instanceGLSurfaceView
Anda menggunakanGLSurfaceView.setRenderer()
.Antarmuka
GLSurfaceView.Renderer
mengharuskan Anda mengimplementasikan metode berikut:-
onSurfaceCreated()
: Sistem memanggil metode ini satu kali, saat membuatGLSurfaceView
. Gunakan metode ini untuk menjalankan tindakan yang perlu terjadi hanya sekali, seperti menetapkan parameter lingkungan OpenGL atau menginisialisasi objek grafis OpenGL. -
onDrawFrame()
: Sistem memanggil metode ini di setiap penggambaran ulangGLSurfaceView
. Gunakan metode ini sebagai titik eksekusi utama untuk menggambar (dan menggambar ulang) objek grafis. -
onSurfaceChanged()
: Sistem memanggil metode ini saat geometriGLSurfaceView
berubah, termasuk perubahan ukuranGLSurfaceView
atau orientasi layar perangkat. Misalnya, sistem memanggil metode ini saat perangkat berubah dari orientasi potret ke lanskap. Gunakan metode ini untuk merespons perubahan di containerGLSurfaceView
.
-
Paket OpenGL ES
Setelah Anda menetapkan tampilan container untuk OpenGL ES menggunakan GLSurfaceView
dan GLSurfaceView.Renderer
, Anda dapat mulai memanggil OpenGL API menggunakan class berikut:
- Paket OpenGL ES 1.0/1.1 API
-
android.opengl
- Paket ini menyediakan antarmuka statis untuk class OpenGL ES i.0/1.one dan performa yang lebih baik daripada antarmuka paketjavax.microedition.khronos
.-
GLES10
-
GLES10Ext
-
GLES11
-
GLES11Ext
-
-
javax.microedition.khronos.opengles
- Paket ini menyediakan implementasi standar OpenGL ES 1.0/i.1.-
GL10
-
GL10Ext
-
GL11
-
GL11Ext
-
GL11ExtensionPack
-
-
- Course OpenGL ES 2.0 API
-
android.opengl.GLES20
- Paket ini menyediakan antarmuka untuk OpenGL ES 2.0 dan tersedia mulai dari Android two.two (API level eight).
-
- Paket OpenGL ES 3.0/3.ane API
-
android.opengl
- Paket ini menyediakan antarmuka untuk class OpenGL ES iii.0/3.one. Versi 3.0 tersedia mulai dari Android 4.3 (API level 18). Versi 3.ane tersedia mulai dari Android 5.0 (API level 21).-
GLES30
-
GLES31
-
GLES31Ext
(Paket Ekstensi Android)
-
-
Jika Anda ingin segera membuat aplikasi dengan OpenGL ES, ikuti kelas Menampilkan grafis dengan OpenGL ES.
Mendeklarasikan persyaratan OpenGL
Jika aplikasi Anda menggunakan fitur OpenGL yang tidak tersedia di semua perangkat, Anda harus menyertakan persyaratan ini dalam file AndroidManifest.xml Anda. Berikut ini beberapa deklarasi manifes OpenGL yang paling umum:
- Persyaratan versi OpenGL ES - Jika aplikasi Anda memerlukan OpenGL ES versi tertentu, Anda harus mendeklarasikan persyaratan tersebut dengan menambahkan setelan berikut ke manifes, seperti ditunjukkan di bawah ini.
Untuk OpenGL ES 2.0:
<!-- Tell the system this app requires OpenGL ES ii.0. --> <uses-feature android:glEsVersion="0x00020000" android:required="truthful" />
Menambahkan deklarasi ini menyebabkan Google Play membatasi aplikasi Anda agar tidak diinstal di perangkat yang tidak mendukung OpenGL ES 2.0. Jika aplikasi Anda ditujukan khusus untuk perangkat yang mendukung OpenGL ES 3.0, Anda juga dapat menentukan ini dalam manifes:
Untuk OpenGL ES 3.0:
<!-- Tell the arrangement this app requires OpenGL ES iii.0. --> <uses-feature android:glEsVersion="0x00030000" android:required="truthful" />
Untuk OpenGL ES three.1:
<!-- Tell the arrangement this app requires OpenGL ES 3.1. --> <uses-characteristic android:glEsVersion="0x00030001" android:required="truthful" />
Catatan: OpenGL ES 3.x API kompatibel dengan OpenGL ES 2.0 API, yang berarti Anda dapat lebih fleksibel dalam mengimplementasikan OpenGL ES dalam aplikasi Anda. Dengan mendeklarasikan OpenGL ES two.0 API sebagai persyaratan dalam manifes, Anda dapat menggunakan versi API tersebut sebagai default, memeriksa ketersediaan OpenGL ES 3.x API pada waktu proses, lalu menggunakan fitur-fitur OpenGL ES 3.x jika perangkat mendukungnya. Untuk informasi lebih lanjut tentang cara memeriksa versi OpenGL ES yang didukung oleh perangkat, lihat Memeriksa versi OpenGL ES.
- Persyaratan kompresi tekstur - Jika aplikasi Anda menggunakan format kompresi tekstur, Anda harus mendeklarasikan format yang didukung aplikasi Anda dalam file manifes menggunakan
<supports-gl-texture>
. Untuk informasi selengkapnya tentang format kompresi tekstur yang tersedia, lihat Dukungan kompresi tekstur.Mendeklarasikan persyaratan kompresi tekstur dalam manifes akan menyembunyikan aplikasi Anda dari pengguna yang perangkatnya tidak mendukung setidaknya salah satu jenis kompresi yang Anda deklarasikan. Untuk informasi selengkapnya tentang cara kerja pemfilteran Google Play untuk kompresi tekstur, lihat bagian Google Play dan pemfilteran kompresi tekstur dalam dokumentasi
<supports-gl-texture>
.
Memetakan koordinat untuk objek yang digambar
Salah satu masalah dasar dalam menampilkan grafis di perangkat Android adalah variasi ukuran dan bentuk layarnya. OpenGL mengasumsikan sistem koordinat persegi dan seragam dan, secara default, menggambar koordinat tersebut ke layar perangkat Anda, yang biasanya tidak berbentuk persegi tetapi dianggap seolah-olah persegi sempurna.
Ilustrasi di atas menunjukkan sistem koordinat seragam yang diasumsikan untuk bingkai OpenGL di sebelah kiri, dan bagaimana koordinat ini dipetakan ke layar perangkat dalam orientasi lanskap di sebelah kanan. Untuk mengatasi masalah ini, Anda dapat menerapkan manner proyeksi OpenGL dan tampilan kamera untuk mengubah koordinat sehingga objek grafis Anda memiliki proporsi yang benar di tampilan apa pun.
Untuk menerapkan proyeksi dan tampilan kamera, buatlah matriks proyeksi dan matriks tampilan kamera, lalu terapkan ke pipeline rendering OpenGL. Matriks proyeksi ini menghitung ulang koordinat grafis Anda sehingga dapat dipetakan dengan benar ke layar perangkat Android. Matriks tampilan kamera membuat transformasi yang merender objek dari posisi pandang tertentu.
Proyeksi dan tampilan kamera di OpenGL ES i.0
Di ES 1.0 API, terapkan proyeksi dan tampilan kamera dengan membuat setiap matriks, lalu tambahkan keduanya ke lingkungan OpenGL.
- Matriks proyeksi - Buat matriks proyeksi menggunakan geometri layar perangkat untuk menghitung ulang koordinat objek sehingga dapat digambar dengan proporsi yang benar. Contoh kode berikut menunjukkan cara memodifikasi metode
onSurfaceChanged()
dalam implementasiGLSurfaceView.Renderer
untuk membuat matriks proyeksi berdasarkan rasio tinggi lebar layar dan menerapkannya ke lingkungan rendering OpenGL.Kotlin
override fun onSurfaceChanged(gl: GL10, width: Int, meridian: Int) { gl.apply { glViewport(0, 0, width, tiptop) // brand adjustments for screen ratio val ratio: Bladder = width.toFloat() / height.toFloat() glMatrixMode(GL10.GL_PROJECTION) // gear up matrix to projection mode glLoadIdentity() // reset the matrix to its default country glFrustumf(-ratio, ratio, -1f, 1f, 3f, 7f) // use the project matrix } }
Java
public void onSurfaceChanged(GL10 gl, int width, int pinnacle) { gl.glViewport(0, 0, width, tiptop); // brand adjustments for screen ratio bladder ratio = (float) width / height; gl.glMatrixMode(GL10.GL_PROJECTION); // set matrix to projection mode gl.glLoadIdentity(); // reset the matrix to its default state gl.glFrustumf(-ratio, ratio, -one, one, 3, vii); // apply the project matrix }
- Matriks transformasi kamera - Setelah menyesuaikan sistem koordinat menggunakan matriks proyeksi, Anda juga harus menerapkan tampilan kamera. Contoh kode berikut menunjukkan cara memodifikasi metode
onDrawFrame()
dalam implementasiGLSurfaceView.Renderer
untuk menerapkan tampilan model dan menggunakan utilitasGLU.gluLookAt()
untuk membuat transformasi tampilan yang menyimulasikan posisi kamera.Kotlin
override fun onDrawFrame(gl: GL10) { ... gl.apply { // Gear up GL_MODELVIEW transformation mode glMatrixMode(GL10.GL_MODELVIEW) glLoadIdentity() // reset the matrix to its default country } // When using GL_MODELVIEW, you must prepare the photographic camera view GLU.gluLookAt(gl, 0f, 0f, -5f, 0f, 0f, 0f, 0f, 1.0f, 0.0f) ... }
Java
public void onDrawFrame(GL10 gl) { ... // Gear up GL_MODELVIEW transformation mode gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); // reset the matrix to its default land // When using GL_MODELVIEW, you must set the camera view GLU.gluLookAt(gl, 0, 0, -v, 0f, 0f, 0f, 0f, 1.0f, 0.0f); ... }
Proyeksi dan tampilan kamera di OpenGL ES 2.0 dan yang lebih tinggi
Di ES two.0 dan 3.0 API, terapkan proyeksi dan tampilan kamera dengan terlebih dahulu menambahkan anggota matriks ke shader verteks objek grafis Anda. Dengan menambahkan anggota matriks ini, Anda dapat membuat dan menerapkan matriks proyeksi dan tampilan kamera ke objek Anda.
- Menambahkan matriks ke shader verteks - Buatlah variabel untuk matriks proyeksi tampilan dan sertakan sebagai pengali posisi shader. Dalam contoh kode shader verteks berikut, anggota
uMVPMatrix
yang disertakan memungkinkan Anda menerapkan matriks proyeksi dan tampilan kamera ke koordinat objek yang menggunakan shader ini.Kotlin
individual val vertexShaderCode = // This matrix member variable provides a hook to manipulate // the coordinates of objects that apply this vertex shader. "uniform mat4 uMVPMatrix; \n" + "aspect vec4 vPosition; \n" + "void principal(){ \n" + // The matrix must exist included equally part of gl_Position // Notation that the uMVPMatrix factor *must be first* in order // for the matrix multiplication production to be right. " gl_Position = uMVPMatrix * vPosition; \north" + "} \n"
Java
individual concluding String vertexShaderCode = // This matrix member variable provides a hook to manipulate // the coordinates of objects that apply this vertex shader. "uniform mat4 uMVPMatrix; \n" + "attribute vec4 vPosition; \northward" + "void main(){ \n" + // The matrix must be included equally part of gl_Position // Note that the uMVPMatrix cistron *must be offset* in gild // for the matrix multiplication product to be correct. " gl_Position = uMVPMatrix * vPosition; \n" + "} \northward";
Perhatikan: Contoh di atas menetapkan satu anggota matriks transformasi di shader verteks tempat Anda menerapkan gabungan matriks proyeksi dan matriks tampilan kamera. Bergantung pada persyaratan aplikasi, Anda dapat menetapkan matriks proyeksi yang terpisah dari anggota matriks penayangan kamera di shader verteks sehingga Anda dapat mengubahnya secara independen.
- Mengakses matriks shader - Setelah membuat hook di shader verteks untuk menerapkan proyeksi dan tampilan kamera, selanjutnya Anda dapat mengakses variabel tersebut untuk menerapkan matriks proyeksi dan matriks tampilan kamera. Kode berikut menunjukkan cara memodifikasi metode
onSurfaceCreated()
dalam implementasiGLSurfaceView.Renderer
untuk mengakses variabel matriks yang ditentukan dalam shader verteks di atas.Kotlin
override fun onSurfaceCreated(gl: GL10, config: EGLConfig) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(plan, "uMVPMatrix") ... }
Java
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... muMVPMatrixHandle = GLES20.glGetUniformLocation(program, "uMVPMatrix"); ... }
- Membuat matriks proyeksi dan tampilan kamera - Buatlah matriks proyeksi dan tampilan untuk diterapkan ke objek grafis. Contoh kode berikut menunjukkan cara memodifikasi metode
onSurfaceCreated()
danonSurfaceChanged()
dalam implementasiGLSurfaceView.Renderer
untuk membuat matriks tampilan kamera dan matriks proyeksi berdasarkan rasio tinggi lebar layar perangkat.Kotlin
override fun onSurfaceCreated(gl: GL10, config: EGLConfig) { ... // Create a camera view matrix Matrix.setLookAtM(vMatrix, 0, 0f, 0f, -3f, 0f, 0f, 0f, 0f, 1.0f, 0.0f) } override fun onSurfaceChanged(gl: GL10, width: Int, height: Int) { GLES20.glViewport(0, 0, width, elevation) val ratio: Float = width.toFloat() / height.toFloat() // create a projection matrix from device screen geometry Matrix.frustumM(projMatrix, 0, -ratio, ratio, -1f, 1f, 3f, 7f) }
Java
public void onSurfaceCreated(GL10 unused, EGLConfig config) { ... // Create a camera view matrix Matrix.setLookAtM(vMatrix, 0, 0, 0, -3, 0f, 0f, 0f, 0f, 1.0f, 0.0f); } public void onSurfaceChanged(GL10 unused, int width, int height) { GLES20.glViewport(0, 0, width, summit); float ratio = (float) width / elevation; // create a projection matrix from device screen geometry Matrix.frustumM(projMatrix, 0, -ratio, ratio, -1, 1, 3, 7); }
- Menerapkan matriks proyeksi dan tampilan kamera - Untuk menerapkan transformasi proyeksi dan tampilan kamera, kalikan kedua matriks tersebut dan tetapkan menjadi shader verteks. Contoh kode berikut menunjukkan cara memodifikasi metode
onDrawFrame()
dalam implementasiGLSurfaceView.Renderer
untuk menggabungkan matriks proyeksi dan tampilan kamera yang dibuat dalam kode di atas, lalu menerapkannya ke objek grafis yang akan dirender oleh OpenGL.Kotlin
override fun onDrawFrame(gl: GL10) { ... // Combine the projection and camera view matrices Matrix.multiplyMM(vPMatrix, 0, projMatrix, 0, vMatrix, 0) // Apply the combined project and camera view transformations GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, vPMatrix, 0) // Depict objects ... }
Java
public void onDrawFrame(GL10 unused) { ... // Combine the projection and photographic camera view matrices Matrix.multiplyMM(vPMatrix, 0, projMatrix, 0, vMatrix, 0); // Utilize the combined projection and photographic camera view transformations GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, faux, vPMatrix, 0); // Draw objects ... }
Untuk contoh lengkap cara menerapkan proyeksi dan tampilan kamera dengan OpenGL ES 2.0, ikuti kelas Menampilkan grafis dengan OpenGL ES.
Membentuk wajah dan lekukan
Di OpenGL, wajah dari sebuah bentuk adalah permukaan yang ditentukan oleh tiga atau lebih titik dalam ruang tiga dimensi. Kumpulan tiga atau lebih titik tiga dimensi ini (disebut verteks di OpenGL) memiliki wajah depan dan wajah belakang. Bagaimana cara menentukan wajah depan dan belakang? Pertanyaan yang bagus. Jawabannya ada hubungannya dengan lekukan, atau arah ke mana Anda menentukan titik-titik bentuk.
Dalam contoh ini, titik-titik segitiga ditentukan dalam suatu urutan sedemikian rupa sehingga titik-titik tersebut digambar dalam arah berlawanan. Urutan penggambaran koordinat ini menentukan arah lekukan untuk bentuk. Secara default, di OpenGL, wajah yang digambar berlawanan arah jarum jam adalah wajah depan. Segitiga yang ditunjukkan dalam Gambar 1 ditentukan sehingga Anda melihat wajah depan bentuk (sebagaimana ditafsirkan oleh OpenGL) dan sisi satunya adalah wajah belakang.
Apa perlunya mengetahui wajah mana yang merupakan wajah depan? Jawabannya ada hubungannya dengan fitur OpenGL yang umum digunakan, yang disebut face culling. Face alternative adalah sebuah opsi pada lingkungan OpenGL yang memungkinkan pipeline rendering untuk mengabaikan (tidak menghitung atau menggambar) wajah belakang dari sebuah bentuk, sehingga menghemat waktu, memori, dan siklus pemrosesan:
Kotlin
gl.apply { // enable face alternative feature glEnable(GL10.GL_CULL_FACE) // specify which faces to not draw glCullFace(GL10.GL_BACK) }
Java
// enable face alternative feature gl.glEnable(GL10.GL_CULL_FACE); // specify which faces to non describe gl.glCullFace(GL10.GL_BACK);
Jika Anda mencoba menggunakan fitur confront culling tanpa mengetahui sisi mana dari bentuk Anda yang merupakan wajah depan dan wajah belakang, grafik OpenGL akan terlihat sedikit tipis, atau mungkin tidak muncul sama sekali. Jadi, selalu tentukan koordinat bentuk OpenGL dengan urutan menggambar berlawanan arah jarum jam.
Catatan: Anda dapat menetapkan lingkungan OpenGL agar memperlakukan wajah searah jarum jam sebagai wajah depan, tetapi melakukannya memerlukan lebih banyak kode dan cenderung membingungkan developer OpenGL berpengalaman saat Anda meminta bantuan mereka. Jadi, jangan lakukan itu.
Versi OpenGL dan kompatibilitas perangkat
Spesifikasi OpenGL ES one.0 dan 1.ane API telah didukung sejak Android 1.0. Mulai dari Android 2.two (API level 8), framework mendukung spesifikasi OpenGL ES ii.0 API. OpenGL ES 2.0 didukung oleh sebagian besar perangkat Android dan direkomendasikan untuk aplikasi baru yang dikembangkan dengan OpenGL. OpenGL ES 3.0 didukung pada Android 4.3 (API level eighteen) dan yang lebih tinggi, di perangkat yang menyediakan implementasi OpenGL ES 3.0 API. Untuk informasi tentang jumlah relatif perangkat berteknologi Android yang mendukung versi OpenGL ES tertentu, lihat Dasbor versi OpenGL ES.
Pemrograman grafis dengan OpenGL ES one.0/1.i API berbeda signifikan dibandingkan menggunakan versi two.0 dan yang lebih tinggi. Versi 1.x API ini memiliki lebih banyak metode kemudahan dan pipeline grafis tetap, sedangkan OpenGL ES 2.0 dan 3.0 API memberikan kontrol langsung lebih besar atas pipeline melalui penggunaan shader OpenGL. Anda harus mempertimbangkan persyaratan grafis dengan cermat dan memilih versi API yang paling sesuai dengan aplikasi Anda. Untuk informasi selengkapnya, lihat Memilih versi OpenGL API.
OpenGL ES three.0 API menyediakan fitur tambahan dan performa yang lebih baik daripada versi ii.0 dan juga mendukung kompatibilitas mundur. Ini berarti Anda berpotensi dapat menulis aplikasi Anda yang menargetkan OpenGL ES 2.0 dan, secara kondisional, menyertakan fitur grafis OpenGL ES 3.0 jika tersedia. Untuk informasi selengkapnya tentang memeriksa ketersediaan OpenGL ES 3.0 API, lihat Memeriksa versi OpenGL ES
Dukungan kompresi tekstur
Kompresi tekstur dapat meningkatkan performa aplikasi OpenGL secara signifikan dengan mengurangi persyaratan memori dan memanfaatkan bandwidth memori secara lebih efisien. Framework Android menyediakan dukungan untuk format kompresi ETC1 sebagai fitur standar, yang menyertakan grade utilitas ETC1Util
dan alat kompresi etc1tool
(terletak di Android SDK di <sdk>/tools/
). Untuk contoh aplikasi Android yang menggunakan kompresi tekstur, lihat contoh kode CompressedTextureActivity
di Android SDK (<sdk>/samples/<version>/ApiDemos/src/com/example/android/apis/graphics/
).
Perhatian: Format ETC1 didukung oleh sebagian besar perangkat Android, tetapi ketersediaannya tidak dijamin. Untuk memeriksa apakah format ETC1 didukung di sebuah perangkat atau tidak, panggil metode ETC1Util.isETC1Supported()
.
Catatan: Format kompresi tekstur ETC1 tidak mendukung tekstur dengan transparansi (saluran alfa). Jika aplikasi Anda memerlukan tekstur dengan transparansi, sebaiknya periksa format kompresi tekstur lain yang tersedia di perangkat target.
Format kompresi tekstur ETC2/EAC dijamin akan tersedia saat menggunakan OpenGL ES 3.0 API. Format tekstur ini menawarkan rasio kompresi yang sangat baik dengan kualitas visual yang tinggi. Format ini juga mendukung transparansi (saluran alfa).
Selain format ETC, perangkat Android memiliki dukungan yang beragam untuk kompresi tekstur berdasarkan chipset GPU dan implementasi OpenGL. Anda perlu mempelajari dukungan kompresi tekstur di perangkat yang Anda targetkan untuk menentukan jenis kompresi apa yang sebaiknya didukung oleh aplikasi Anda. Untuk menentukan format tekstur apa yang didukung di perangkat tertentu, Anda harus mengkueri perangkat dan mempelajari nama ekstensi OpenGL, yang mengidentifikasi format kompresi tekstur apa saja (dan fitur OpenGL lainnya) yang didukung oleh perangkat. Format kompresi tekstur yang umum didukung adalah sebagai berikut:
- ATITC (ATC) - Kompresi tekstur ATI (ATITC atau ATC) tersedia di berbagai perangkat dan mendukung kompresi laju tetap untuk tekstur RGB dengan dan tanpa saluran alfa. Format ini dapat diwakili oleh beberapa nama ekstensi OpenGL, misalnya:
-
GL_AMD_compressed_ATC_texture
-
GL_ATI_texture_compression_atitc
-
- PVRTC - Kompresi tekstur PowerVR (PVRTC) tersedia di berbagai perangkat dan mendukung tekstur 2 flake dan 4 bit per piksel dengan atau tanpa saluran alfa. Format ini diwakili oleh nama ekstensi OpenGL berikut:
-
GL_IMG_texture_compression_pvrtc
-
- S3TC (DXTn/DXTC) - Kompresi tekstur S3 (S3TC) memiliki beberapa variasi format (DXT1 hingga DXT5) dan ketersediaannya tidak begitu luas. Format ini mendukung tekstur RGB dengan saluran alfa four flake atau 8 fleck. Formats ini diwakili oleh nama ekstensi OpenGL berikut:
-
GL_EXT_texture_compression_s3tc
-
GL_EXT_texture_compression_dxt1
-
- 3DC - Kompresi tekstur 3DC (3DC) adalah format yang ketersediaannya tidak begitu luas dan mendukung tekstur RGB dengan saluran alfa. Format ini diwakili oleh nama ekstensi OpenGL berikut:
-
GL_AMD_compressed_3DC_texture
-
Peringatan: Format kompresi tekstur ini tidak didukung di semua perangkat. Dukungan untuk format ini dapat bervariasi menurut produsen dan perangkat. Untuk informasi tentang cara menentukan format kompresi tekstur apa yang digunakan di perangkat tertentu, lihat bagian berikutnya.
Perhatikan: Setelah Anda menentukan format kompresi tekstur mana yang akan didukung aplikasi, pastikan Anda mendeklarasikannya dalam manifes menggunakan <supports-gl-texture>. Penggunaan deklarasi ini memungkinkan pemfilteran oleh layanan eksternal seperti Google Play, sehingga aplikasi Anda hanya diinstal di perangkat yang mendukung format yang diperlukan oleh aplikasi Anda. Untuk detailnya, lihat deklarasi manifes OpenGL.
Menentukan ekstensi OpenGL
Implementasi OpenGL bervariasi menurut perangkat Android dalam hal ekstensi ke OpenGL ES API yang didukung. Ekstensi ini mencakup kompresi tekstur, tetapi biasanya juga menyertakan ekstensi lain ke set fitur OpenGL.
Untuk menentukan format kompresi tekstur, dan ekstensi OpenGL lainnya, yang didukung di perangkat tertentu:
- Jalankan kode berikut di perangkat target untuk menentukan format kompresi tekstur yang didukung:
Kotlin
var extensions = gl.glGetString(GL10.GL_EXTENSIONS)
Java
String extensions = gl.glGetString(GL10.GL_EXTENSIONS);
Peringatan: Hasil dari panggilan ini bervariasi menurut model perangkat. Anda harus menjalankan panggilan ini di beberapa perangkat target untuk menentukan jenis kompresi apa yang umumnya didukung.
- Pelajari output metode ini untuk menentukan ekstensi OpenGL apa yang didukung di perangkat.
Paket Ekstensi Android (AEP)
AEP memastikan bahwa aplikasi Anda mendukung seperangkat ekstensi OpenGL standar di atas dan di luar set inti yang dijelaskan dalam spesifikasi OpenGL 3.1. Memaketkan ekstensi ini bersama-sama memungkitkan set fungsionalitas yang konsisten di seluruh perangkat, sekaligus memungkinkan programmer memanfaatkan sepenuhnya perangkat GPU seluler terbaru.
AEP juga meningkatkan dukungan untuk gambar, buffer penyimpanan shader, dan penghitung atomik di shader fragment.
Agar aplikasi Anda dapat menggunakan AEP, manifes aplikasi harus mendeklarasikan bahwa AEP diperlukan. Selain itu, versi platform harus mendukungnya.
Deklarasikan persyaratan AEP dalam manifes sebagai berikut:
<uses characteristic android:name="android.hardware.opengles.aep" android:required="true" />
Untuk memverifikasi bahwa versi platform mendukung AEP, gunakan metode hasSystemFeature(String)
, dengan meneruskan FEATURE_OPENGLES_EXTENSION_PACK
sebagai argumen. Cuplikan kode berikut menunjukkan contoh cara melakukannya:
Kotlin
var deviceSupportsAEP: Boolean = packageManager.hasSystemFeature(PackageManager.FEATURE_OPENGLES_EXTENSION_PACK)
Java
boolean deviceSupportsAEP = getPackageManager().hasSystemFeature (PackageManager.FEATURE_OPENGLES_EXTENSION_PACK);
Jika metode ini menampilkan nilai truthful, berarti AEP didukung.
Untuk informasi selengkapnya tentang AEP, kunjungi halamannya di Registry OpenGL ES Khronos.
Memeriksa versi OpenGL ES
Ada beberapa versi OpenGL ES yang tersedia di perangkat Android. Anda dapat menentukan versi minimum API yang diperlukan aplikasi Anda di manifes, tetapi, pada secara bersamaan, Anda juga dapat memanfaatkan fitur-fitur di API yang lebih baru. Misalnya, OpenGL ES 3.0 API mendukung kompatibilitas mundur dengan versi 2.0 dari API ini, jadi sebaiknya Anda menulis aplikasi yang dapat memanfaatkan fitur-fitur OpenGL ES three.0, tetapi kembali ke versi 2.0 jika versi 3.0 tidak tersedia.
Sebelum menggunakan fitur OpenGL ES dari versi yang lebih tinggi daripada versi minimum yang diperlukan dalam manifes aplikasi Anda, aplikasi Anda harus memeriksa versi API yang tersedia di perangkat. Anda dapat melakukannya dengan salah satu dari dua cara berikut:
- Coba buat konteks OpenGL ES level lebih tinggi (
EGLContext
) dan periksa hasilnya. - Buat konteks OpenGL ES minimum yang didukung dan periksa nilai versinya.
Contoh kode berikut menunjukkan cara memeriksa versi OpenGL ES yang tersedia dengan membuat EGLContext
dan memeriksa hasilnya. Contoh ini menunjukkan cara memeriksa versi OpenGL ES 3.0:
Kotlin
private const val EGL_CONTEXT_CLIENT_VERSION = 0x3098 individual const val glVersion = 3.0 private course ContextFactory : GLSurfaceView.EGLContextFactory { override fun createContext(egl: EGL10, brandish: EGLDisplay, eglConfig: EGLConfig): EGLContext { Log.west(TAG, "creating OpenGL ES $glVersion context") return egl.eglCreateContext( brandish, eglConfig, EGL10.EGL_NO_CONTEXT, intArrayOf(EGL_CONTEXT_CLIENT_VERSION, glVersion.toInt(), EGL10.EGL_NONE) ) // returns null if 3.0 is non supported } }
Java
individual static double glVersion = 3.0; private static grade ContextFactory implements GLSurfaceView.EGLContextFactory { private static int EGL_CONTEXT_CLIENT_VERSION = 0x3098; public EGLContext createContext( EGL10 egl, EGLDisplay display, EGLConfig eglConfig) { Log.w(TAG, "creating OpenGL ES " + glVersion + " context"); int[] attrib_list = {EGL_CONTEXT_CLIENT_VERSION, (int) glVersion, EGL10.EGL_NONE }; // attempt to create a OpenGL ES 3.0 context EGLContext context = egl.eglCreateContext( display, eglConfig, EGL10.EGL_NO_CONTEXT, attrib_list); render context; // returns nix if 3.0 is not supported; } }
Jika metode createContext()
yang ditampilkan di atas menampilkan nilai cipher, kode Anda perlu membuat konteks OpenGL ES ii.0 dan kembali menggunakan API tersebut.
Contoh kode berikut menunjukkan cara memeriksa versi OpenGL ES dengan membuat konteks minimum yang didukung terlebih dahulu, lalu memeriksa cord versi:
Kotlin
// Create a minimum supported OpenGL ES context, then cheque: gl.glGetString(GL10.GL_VERSION).also { Log.w(TAG, "Version: $information technology") } // The version format is displayed as: "OpenGL ES <major>.<small>" // followed by optional content provided by the implementation.
Java
// Create a minimum supported OpenGL ES context, and then check: String version = gl.glGetString(GL10.GL_VERSION); Log.due west(TAG, "Version: " + version ); // The version format is displayed as: "OpenGL ES <major>.<minor>" // followed by optional content provided past the implementation.
Dengan pendekatan ini, jika Anda menemukan bahwa perangkat mendukung versi API level yang lebih tinggi, Anda harus menghancurkan konteks OpenGL ES minimum dan membuat konteks baru dengan versi API lebih tinggi yang tersedia.
Memilih versi OpenGL API
OpenGL ES 1.0 API (dan ekstensi 1.1), versi two.0, dan versi 3.0 semuanya menyediakan antarmuka grafis berperforma tinggi untuk membuat game, visualisasi, dan antarmuka pengguna 3D. Pemrograman grafis untuk OpenGL ES 2.0 dan 3.0 sebagian besar mirip, di mana versi 3.0 mewakili superset versi two.0 dengan fitur-fitur tambahan. Pemrograman untuk OpenGL ES ane.0/1.1 API berbeda signifikan dengan OpenGL ES 2.0 dan iii.0, sehingga developer harus mempertimbangkan faktor-faktor berikut dengan cermat sebelum memulai pengembangan dengan API ini:
- Performa - Secara umum, OpenGL ES 2.0 dan 3.0 memberikan performa grafis yang lebih cepat daripada ES 1.0/1.ane API. Namun, perbedaan performa ini dapat bervariasi berdasarkan perangkat Android yang menjalankan aplikasi OpenGL Anda, karena adanya perbedaan implementasi produsen hardware untuk pipeline grafis OpenGL ES.
- Kompatibilitas Perangkat - Developer harus mempertimbangkan jenis perangkat, versi Android, dan versi OpenGL ES yang tersedia bagi pelanggan mereka. Untuk informasi selengkapnya tentang kompatibilitas OpenGL di seluruh perangkat, lihat bagian Versi OpenGL dan kompatibilitas perangkat.
- Kenyamanan Coding - OpenGL ES 1.0/1.one API menyediakan pipeline fungsi tetap dan fungsi kenyamanan yang tidak tersedia di OpenGL ES two.0 atau three.0 API. Programmer yang baru mengenal OpenGL ES mungkin akan merasa coding untuk versi 1.0/i.one lebih cepat dan lebih nyaman.
- Kontrol Grafis - OpenGL ES 2.0 dan three.0 API memberikan tingkat kontrol yang lebih tinggi dengan menyediakan pipeline yang terprogram sepenuhnya melalui penggunaan shader. Dengan kontrol langsung yang lebih besar atas pipeline pemrosesan grafis, programmer dapat menciptakan efek yang akan sangat sulit dihasilkan menggunakan OpenGL ES 1.0/1.1 API.
- Dukungan Tekstur - OpenGL ES iii.0 API memiliki dukungan terbaik untuk kompresi tekstur karena menjamin ketersediaan format kompresi ETC2, yang mendukung transparansi. Implementasi OpenGL ES 1.x dan 2.0 API biasanya mencakup dukungan untuk ETC1, tetapi format tekstur ini tidak mendukung transparansi sehingga Anda harus menyediakan resource dalam format kompresi lain yang didukung oleh perangkat yang Anda targetkan. Untuk informasi selengkapnya, lihat Dukungan kompresi tekstur.
Meskipun performa, kompatibilitas, kepraktisan, kontrol, dan faktor lainnya dapat memengaruhi keputusan, sebaiknya Anda memilih versi OpenGL API berdasarkan apa yang menurut Anda akan memberikan pengalaman terbaik kepada pengguna.
Content and code samples on this page are field of study to the licenses described in the Content License. Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
Last updated 2019-12-27 UTC.
Source: https://developer.android.com/guide/topics/graphics/opengl?hl=id
0 Response to "what is needed to support open gl 3.2"
Post a Comment