Tekstur

Ikuti praktik terbaik berikut untuk mengoptimalkan tampilan dan performa tekstur di game Android Anda.

Tekstur merupakan elemen inti dalam seni 3D Anda. Game 3D yang berjalan lancar pada sejumlah besar perangkat dimulai dengan seni 3D yang telah dirancang untuk memanfaatkan prosesor grafis secara optimal. Panduan ini menjelaskan pengoptimalan dan praktik terbaik untuk tekstur di perangkat seluler agar game Anda berperforma lebih baik dan meminimalkan pemakaian daya sekaligus mempertahankan kualitas visual yang tinggi.

Beberapa bagian artikel ini didasarkan pada karya kontribusi berhak cipta dari Arm Limited.

Membuat Atlas Tekstur

Atlas tekstur adalah tekstur yang dirancang untuk memuat data gambar beberapa objek visual, seperti mesh 3D atau sprite 2D. Tekstur atlas digunakan untuk menggabungkan gambar dari setiap objek karena setiap objek tidak memiliki teksturnya sendiri.

Mesh yang menggunakan tekstur atlas bersama
Gambar 1. Sorotan berwarna kuning di adegan yang dirender (kiri) menunjukkan mesh yang berbagi atlas tekstur (kanan).

Meminimalkan jumlah panggilan gambar frame game merupakan elemen penting untuk mencapai performa rendering yang optimal. Penggunaan tekstur yang sama untuk objek yang berbeda merupakan salah satu faktor penggabungan objek menjadi satu panggilan gambar. Pengurangan panggilan gambar sangat penting untuk game yang dibatasi oleh kecepatan CPU karena setiap panggilan gambar menyebabkan overhead CPU saat diproses oleh driver grafis. Atlas tekstur juga mengurangi jumlah file aset tekstur dalam data runtime game Anda. Ratusan atau bahkan ribuan tekstur dapat digabungkan menjadi sejumlah file atlas tekstur yang jauh lebih kecil.

Anda harus merencanakan tata letak atlas tekstur saat membuat mesh 3D. Jika atlas ditulis sebelum membuat aset mesh, aset mesh harus berupa UV yang dibuka mengikuti atlas tekstur. Jika atlas dibuat setelah penulisan, menggunakan penggabungan atau alat pembuat atlas dalam software melukis, UV island harus diatur ulang sesuai dengan tekstur.

Pengelompokan panggilan gambar khusus mesin

Game engine Unity memiliki fitur pengelompokan panggilan gambar yang dapat otomatis menggabungkan objek. Agar memenuhi syarat untuk pengelompokan otomatis, objek harus menggunakan material yang sama, termasuk tekstur, dan ditandai sebagai statis.

Unreal Engine 4 memerlukan penyiapan manual untuk dapat dikelompokkan. Anda dapat menggabungkan objek dalam software 3D sebelum mengimpornya ke Unreal. Unreal juga menyertakan alat UE4 Actor Merging yang dapat menggabungkan mesh dan membuat file atlas tekstur.

Membuat Mipmap

Mipmap adalah versi tekstur dengan resolusi yang lebih rendah. Kumpulan mipmap untuk tekstur tertentu disebut rantai mipmap. Setiap level mipmap berikutnya dalam rantai memiliki resolusi yang lebih rendah dibandingkan dengan level sebelumnya. Mipmap digunakan untuk mengimplementasikan LOD (level detail) tekstur selama rendering. Saat tekstur yang di-mipmap terikat ke tahap tekstur, hardware grafis akan menggunakan ruang tekstur yang ditempati oleh fragmen untuk memilih level dari rantai mipmap. Saat merender adegan 3D, objek yang berada lebih jauh dari kamera akan menggunakan mipmap dengan resolusi yang lebih rendah dibandingkan dengan objek sama yang berada lebih dekat dengan kamera.

Tekstur yang di-mipmap menggunakan lebih banyak memori dibandingkan dengan tekstur yang tidak di-mipmap. Level mipmap tambahan meningkatkan jejak memori tekstur sebesar 33%. Jika tekstur digambar pada jarak tetap dari kamera, menghasilkan mipmap hanya akan membuang-buang memori.

Rantai mipmap dari resolusi tekstur dasar 512x512 piksel
Gambar 2. Rantai mipmap, resolusi dasar tekstur adalah 512x512 piksel.

Penggunaan mipmap yang benar akan meningkatkan performa GPU. Ketersediaan level mipmap dengan resolusi yang lebih rendah akan mengurangi penggunaan bandwidth memori dan meningkatkan keberadaan cache tekstur.

Mipmapping juga dapat meningkatkan kualitas visual dengan mengurangi pembuatan alias tekstur. Pembuatan alias tekstur dapat dilihat sebagai efek pergantian pada area yang berada lebih jauh dari kamera.

Contoh pembuatan alias tekstur
Gambar 3. Contoh pembuatan alias tekstur. Satu gambar dirender tanpa mipmap (kiri), sedangkan gambar satunya dirender dengan mipmap (kanan). Pembuatan alias tekstur dapat dilihat di dalam persegi panjang merah di gambar kiri.

Detail mipmap khusus mesin

Unreal Engine 4 memerlukan dimensi tekstur yang memiliki dua pangkat (misalnya 512x1024, 128x128) untuk menggunakan mipmapping. Rantai Mipmap tidak akan dihasilkan jika salah satu atau kedua dimensi tekstur tersebut bukan pangkat dua.

Mesin Unity akan otomatis menskalakan tekstur dengan dimensi yang bukan pangkat dua untuk membuat mipmap. Pastikan file tekstur sumber memiliki dimensi pangkat dua untuk menghindari penskalaan ini.

Memilih mode penyaringan tekstur yang sesuai

Penyaringan tekstur adalah fitur rendering hardware yang memengaruhi tampilan visual dari segitiga yang dirender. Penggunaan penyaringan tekstur yang tepat dapat meningkatkan kualitas visual adegan. Ada beberapa mode penyaringan tekstur, masing-masing dengan keseimbangan yang berbeda antara peningkatan rendering dan biaya. Biaya termasuk waktu komputasi dan bandwidth memori. Tiga mode penyaringan tekstur yang umum tersedia adalah: terdekat (atau titik), bilinear, dan trilinear. Anisotropik adalah metode penyaringan tekstur tambahan yang dapat digabungkan dengan penyaringan bilinear atau trilinear.

Terdekat

Terdekat adalah mode penyaringan tekstur paling sederhana dan murah. Sampel terdekat adalah texel tunggal menggunakan koordinat yang ditentukan dalam tekstur sumber. Segitiga yang dirender dengan posisi terdekat akan memiliki tampilan kotak-kotak atau pecah, terutama saat dirender tidak jauh dari kamera.

Bilinear

Penyaringan bilinear mengambil sampel empat texel yang mengelilingi koordinat yang ditentukan dalam tekstur sumber. Keempat texel tersebut dirata-ratakan untuk menentukan warna tekstur fragmen. Penyaringan bilinear menghasilkan gradien yang lebih halus di tiap pikselnya sehingga tampilan pada penyaringan terdekat tidak kotak-kotak. Segitiga yang dirender di dekat kamera akan tampak buram, tidak pecah. Biaya untuk penyaringan bilinear lebih tinggi daripada biaya untuk penyaringan terdekat karena adanya sampel texel tambahan dan rata-rata.

Perbandingan antara penyaringan terdekat dan bilinear
Gambar 4. Perbandingan penyaringan tekstur terdekat (kiri) dan bilinear (kanan).

Trilinear

Saat merender mesh dengan jarak verteks dari kamera bervariasi, Anda dapat memilih beberapa level mipmap selama rendering. Perubahan antara dua level mipmap dapat menghasilkan potongan tajam yang tampak jelas di titik transisi. Penyaringan trilinear melemahkan transisi ini dengan melakukan penyaringan bilinear pada dua level mipmap yang berbeda dan melakukan interpolasi pada hasilnya. Penggunaan beberapa level mip dan interpolasi mengakibatkan trilinear lebih mahal secara komputasi dibandingkan dengan bilinear.

Perbandingan antara penyaringan bilinear dan trilinear
Gambar 5. Perbandingan penyaringan tekstur bilinear (kiri) dan trilinear (kanan). Region yang di-zoom mengontraskan perbedaan dalam rendering di sepanjang transisi mipmap.

Anisotropik

Penyaringan anisotropik meningkatkan kualitas visual mesh bertekstur yang dirender pada sudut ekstrem secara relatif terhadap kamera. Bidang permukaan tanah merupakan contoh umum dari jenis mesh ini. Penyaringan anisotropik memerlukan tekstur yang di-mipmap agar berfungsi. Rasio atau level penyaringan anisotropik yang diterapkan selama rendering dapat dikonfigurasi. Biaya penyaringan anisotropik meningkat seiring dengan meningkatnya level.

Perbandingan antara penyaringan anisotropik 1x dan 2x
Gambar 6. Perbandingan penyaringan anisotropik bilinear/1x (kiri) dan penyaringan anisotropik bilinear/2x (kanan)

Strategi pemilihan mode

Penyaringan bilinear umumnya merupakan keseimbangan terbaik antara performa dan kualitas visual. Penyaringan trilinear memerlukan bandwidth memori yang jauh lebih banyak dan harus digunakan secara selektif. Dalam banyak kasus, penyaringan bilinear yang dikombinasikan dengan penyaringan anisotropik 2x akan terlihat dan berperforma lebih baik jika dibandingkan dengan penyaringan trilinear yang menggunakan penyaringan anisotropik 1x. Peningkatan level anisotropik lebih dari 2x memerlukan biaya yang sangat mahal dan harus dilakukan dengan sangat selektif untuk aset-aset game yang sangat penting.

Penyaringan tekstur dapat mencakup setengah dari total penggunaan energi GPU, sehingga memilih penyaring tekstur yang lebih sederhana jika bisa akan menjadi solusi terbaik untuk mengurangi kebutuhan daya game.

Mengoptimalkan ukuran tekstur

Pastikan dimensi tekstur sekecil mungkin sambil tetap mencapai kualitas gambar yang diinginkan. Tinjau aset tekstur Anda untuk memastikan tidak adanya tekstur yang besar dan keliru. Prinsip ini berlaku untuk tekstur diskrit dan atlas. Jika game mendukung banyak perangkat yang mencakup berbagai resolusi dan kemampuan performa, sebaiknya buat versi resolusi aset rendah dan tinggi untuk kelas perangkat yang sesuai.

Saat merender mesh yang menggunakan beberapa tekstur dalam materialnya, sebaiknya kurangi resolusi beberapa tekstur secara selektif. Misalnya, saat menggunakan tekstur difusi 1024x1024, pengurangan kekasaran atau tekstur peta metalik menjadi 512x512 bisa dilakukan dan hanya akan berdampak minimal pada kualitas gambar. Periksa dampak dari semua eksperimen pengubahan ukuran tersebut untuk memastikan eksperimen tidak mengurangi tingkat kualitas yang diinginkan.

Menggunakan ruang warna yang sesuai

Banyak paket software yang digunakan untuk membuat tekstur beroperasi dan diekspor menggunakan ruang warna sRGB. Tekstur difusi yang diproses sebagai warna dapat menggunakan ruang warna SRGB. Tekstur yang tidak diproses sebagai warna, seperti peta metalik, kekasaran, atau normal, tidak boleh diekspor di ruang warna sRGB.

Setelan tekstur mesin game menyertakan parameter untuk mengetahui apakah tekstur menggunakan ruang warna sRGB atau tidak.

Setelan tekstur sRGB di Unity dan Unreal Engine 4
Gambar 7. setelan tekstur sRGB di Unity (kiri) dan Unreal Engine 4 (kanan).

Karena data piksel tekstur tersebut tidak digunakan sebagai data warna, penggunaan ruang warna sRGB akan menghasilkan visual yang tidak tepat.

Merender peta metalik kekasaran di ruang warna linear versus sRGB
Gambar 8. Peta metalik kekasaran (non-sRGB) linear (kiri) dan peta metalik kekasaran sRGB (kanan). Refleksi di sebelah kanan salah.

Menggunakan kompresi tekstur

Kompresi tekstur adalah algoritme kompresi gambar yang diterapkan pada data piksel yang tidak dikompresi, sehingga menghasilkan tekstur dan dapat dengan cepat didekompresi oleh hardware grafis selama rendering. Penggunaan kompresi tekstur yang efektif dapat mengurangi penggunaan memori dan meningkatkan performa dengan dampak minimal pada kualitas visual. Tiga algoritme kompresi tekstur paling umum di Android: ETC1, ETC2, dan ASTC. Untuk game modern, ASTC umumnya merupakan opsi utama terbaik, dengan ETC2 menjadi opsi penggantian jika game Anda menargetkan perangkat yang tidak mendukung ASTC.

ETC1

ETC1 didukung oleh semua perangkat Android. ETC1 hanya mendukung mode data bit RGB empat bit per piksel. ETC1 tidak mendukung saluran alfa. Kebanyakan mesin game yang mendukung ETC1 memungkinkan tekstur ETC1 kedua digunakan untuk merepresentasikan data saluran alfa.

ETC2

ETC2 didukung oleh lebih dari 90% perangkat Android aktif. Perangkat yang sangat lama yang tidak mendukung OpenGL ES 3.0 API tidak dapat menggunakan ETC2. Dibandingkan dengan ETC1, ETC2 menambahkan:

  • Dukungan saluran alfa, baik 'punchthrough' delapan bit maupun satu bit
  • Versi sRGB tekstur RGB dan RGBA
  • Tekstur saluran satu dan dua, R11 dan RG11

ASTC

ASTC didukung oleh lebih dari 75% perangkat Android aktif. ASTC memiliki ukuran blok kompresi yang dapat dikonfigurasi, yang memberi Anda kontrol terperinci untuk menyeimbangkan rasio kompresi terhadap kualitas gambar untuk tekstur tertentu. ASTC sering kali dapat mencapai kualitas unggul pada ukuran memori yang sama dengan ETC2, atau kuantitas serupa pada ukuran memori yang lebih kecil daripada ETC2.

Perbandingan visual format kompresi tekstur menggunakan gambar sumber yang sama
Gambar 9. Perbandingan antara gambar yang: tidak dikompresi (kiri, 17 MB), dikompresi dengan ETC1 (tengah, 3 MB), dikompresi dengan ASTC (kanan, 2,5 MB).

Kecepatan kompresi tekstur

Kompresi tekstur dapat memakan waktu yang lama jika game Anda memiliki banyak tekstur. ETC dan ASTC memiliki setelan kualitas kompresi yang dapat dipilih. Setelan dengan kualitas lebih tinggi memerlukan waktu kompresi yang lebih lama. Selama pengembangan, Anda mungkin ingin mengurangi tingkat kualitas untuk mengurangi waktu kompresi dan menaikkan tingkat kualitas sebelum membuat build penting.

Kompresi tekstur di mesin game

Jika menggunakan mesin game, Anda mungkin harus memilih format kompresi tekstur (ETC atau ASTC) di level project. Guna mendukung beberapa format kompresi untuk kompatibilitas maksimum, Anda mungkin perlu melakukan tindakan tambahan. Penargetan Format Kompresi Tekstur Google Play Asset Delivery dapat membantu menyertakan beberapa format dalam game, dan hanya menayangkan format yang paling optimal ke setiap perangkat pada waktu penginstalan.

Membuka UV

Pastikan UV island selurus mungkin. Hal ini membantu tekstur Anda dengan cara berikut:

  • Pengemasan UV island lebih mudah sehingga tidak menghabiskan ruang perangkat.
  • UV yang lurus akan mengurangi 'efek tangga' pada tekstur.
  • Pengemasan UV yang baik memastikan resolusi tekstur yang optimal.
  • Tekstur kualitas yang lebih baik, meskipun UV sedikit terdistorsi karena pelurusan.
UV island yang belum dioptimalkan versus UV island yang sudah dioptimalkan
Gambar 10. UV island yang tidak dioptimalkan (kiri) dan UV island yang sudah diluruskan/dibuka (kanan).

Sambungan tekstur yang terlihat pada model tampak buruk. Coba letakkan sambungan UV pada tempat yang kurang terlihat. Untuk membantu membuat peta normal yang lebih baik, pisahkan UV island bertepi tajam dan beri ruang di sekitar island.

Menghindari detail yang tidak terlihat

Saat membuat karya seni, jangan menambahkan detail yang tidak akan terlihat, terutama pada game yang dirancang untuk perangkat dengan layar yang lebih kecil. Percuma jika Anda membuat tekstur 4096x4096 dengan detail yang rumit pada model kursi kecil karena hampir tidak terlihat di sudut ruangan. Dalam kasus tertentu, Anda mungkin harus memperbesar tepi (menambahkan highlight tambahan) dan bayangan untuk memperbaiki persepsi bentuk.

Tekstur kecil digunakan pada model yang dirender dari jarak jauh
Gambar 11. Teks kecil berukuran 256x256 yang tidak memiliki detail berlebihan akan digunakan pada model tentara yang dirender dari jarak jauh.

Mem-baking detail

Perangkat seluler memiliki ukuran layar yang lebih kecil dan hardware grafis yang tidak terlalu canggih dibandingkan komputer pribadi atau konsol game. Daripada harus menghitung efek seperti oklusi ambien atau sorotan spekuler pada waktu proses, sebaiknya 'baking' efeknya ke dalam tekstur difusi jika memungkinkan. Cara ini akan membantu performa dan memastikan visibilitas detail Anda.

Mem-baking sorotan dan oklusi ambien menjadi tekstur difusi
Gambar 12. Sorotan dan oklusi ambien yang mem-baking ke dalam tekstur difusi (kiri) dan dirender dalam game (kanan).

Menggunakan tint warna

Jika Anda dapat membuat shader kustom dan memiliki mesh dengan skema warna yang serupa atau seragam, sebaiknya gunakan tint warna pada mesh yang sesuai. Dengan tint warna, tekstur hitam putih akan digunakan dan ini hanya memerlukan lebih sedikit memori tekstur dibandingkan tekstur RGB. Data warna per vertex diterapkan oleh shader untuk mewarnai mesh. Metode alternatif untuk menambahkan tint adalah dengan menggunakan mask RGB dan menerapkan tekstur berdasarkan rentang warna mask.

Tekstur hitam putih diberi tint selama waktu proses
Gambar 13. Tekstur hitam putih (kiri) yang diberi tint selama runtime untuk model pilar (kanan).

Mengemas saluran tekstur

Saat merender material dengan beberapa tekstur, cari kesempatan untuk menggabungkan tekstur yang hanya menggunakan satu saluran warna menjadi satu tekstur yang menggunakan ketiga saluran warna tersebut. Tindakan ini akan mengurangi penggunaan memori dan jumlah operasi sampler tekstur yang dilakukan oleh shader fragmen.

Tiga tekstur saluran tunggal digabungkan menjadi satu tekstur multi-saluran
Gambar 14. Tiga tekstur satu saluran (kiri) digabungkan menjadi satu tekstur multi-saluran (kanan). Data oklusi ambien ditetapkan ke warna merah, peta kekasaran/kehalusan ke warna hijau, dan peta metalik ke warna biru.

Saat mengemas, tetapkan data dengan detail paling lengkap ke saluran hijau. Mata manusia umumnya lebih sensitif terhadap warna hijau, dan hardware grafis biasanya menetapkan lebih banyak bit ke saluran hijau. Misalnya, peta kekasaran/kehalusan biasanya akan memiliki detail yang lebih banyak dibandingkan dengan peta metalik, dan merupakan pilihan yang sempurna untuk ditetapkan ke saluran hijau.

Untuk material yang menggunakan saluran alfa, jika Anda hanya menggunakan dua saluran pada tekstur yang dikemas, sebaiknya masukkan data saluran alfa ke dalam tekstur yang dikemas, bukan tekstur difusi Anda. Bergantung pada format tekstur difusi, cara ini dapat membantu Anda mengurangi ukurannya atau meningkatkan kualitas visualnya dengan menghapus data saluran alfa.

Saluran alfa yang dikemas ke dalam tekstur lain
Gambar 15. Peta opasitas saluran alfa dikemas ke dalam tekstur bersama dengan peta kekasaran/kehalusan dan peta metalik.

Pastikan tekstur yang dikemas disetel ke ruang warna RGB linear, bukan sRGB.

Membuat peta normal

Pemetaan normal merupakan suatu teknik yang memberikan tampilan detail ke model 3D tanpa menggunakan geometri tambahan. Fitur seperti kerutan atau sekrup yang mungkin memerlukan banyak segitiga untuk dibuat model dapat disimulasikan menggunakan peta normal. Pemetaan normal mungkin terlihat tepat atau mungkin tidak, tergantung pada gaya seni dan arah game.

Model yang dirender dengan dan tanpa peta normal
Gambar 16. Model yang dirender tanpa peta normal (kiri), dan model sama yang dirender dengan peta normal (tengah), dan tekstur peta normal (kanan).

Peta normal memang menimbulkan biaya performa dan harus digunakan seperlunya di perangkat yang lebih rendah. Peta normal memerlukan tekstur tambahan sehingga mengakibatkan pengambilan sampel tekstur tambahan dan penghitungan shader fragmen.

Praktik terbaik peta normal

Berikut adalah beberapa praktik terbaik untuk membuat peta normal:

Menggunakan cage

Cage adalah versi yang lebih besar, atau timbul, dari model poligon rendah. Cage harus mencakup model poligon tinggi agar berfungsi dengan baik selama baking peta normal. Cage digunakan untuk membatasi jarak raycast selama baking peta normal dan membantu menghindari masalah saat memisahkan sambungan standar pada peta normal.

Cage yang mengelilingi mesh poligon rendah
Gambar 17. Cage yang mengelilingi mesh poligon rendah.
Model yang dirender menggunakan peta normal dengan dan tanpa cage
Gambar 18. Rendering model menggunakan peta normal yang dibuat dengan cage (kiri) dibandingkan dengan model yang dirender menggunakan peta normal yang dibuat tanpa cage (kanan).

Pencocokan baking berdasarkan nama mesh

Jika software baking Anda mendukungnya, lakukan baking berdasarkan nama mesh. Fitur ini mengurangi masalah proyeksi peta normal yang salah. Jika terlalu dekat satu sama lain, objek mungkin tidak sengaja memproyeksikan peta normalnya ke permukaan yang salah. Pencocokan berdasarkan nama mesh memastikan baking hanya dilakukan pada permukaan yang benar. Untuk informasi selengkapnya tentang fitur ini di Substance Painter, lihat halaman ini. Untuk informasi selengkapnya tentang fitur ini di Marmoset Toolbag, lihat halaman ini.

Menguraikan mesh

Jika Anda tidak dapat mencocokkan nama mesh saat baking, sebaiknya urai mesh Anda. Dengan menguraikan mesh, setiap bagian akan saling terpencar sehingga peta normal tidak memproyeksikan ke permukaan yang salah. Jika Anda juga mem-baking oklusi ambien Anda mungkin perlu melakukannya secara terpisah dengan mesh yang tidak terurai.

Mesh yang terurai untuk baking peta normal
Gambar 19. Mesh yang terurai untuk baking peta normal

Meminimalkan sambungan

UV berkelanjutan pada tepi tajam akan menyebabkan sambungan terlihat, jadi pisahkan UV pada tepi tajam untuk meminimalkan efek ini. Saat menetapkan grup penghalusan, sebagai pedoman umum, buat sudut kurang dari 90 derajat. Sambungan UV harus memiliki berbagai grup penghalusan pada segitiga.