Saat ini saya sedang mengembangkan game OpenGL kecil untuk platform Android dan saya ingin tahu apakah ada cara mudah untuk membuat teks di atas frame yang diberikan (seperti HUD dengan skor pemain, dll.). Teks juga perlu menggunakan font khusus.
Saya telah melihat contoh menggunakan Tampilan sebagai hamparan, tetapi saya tidak tahu apakah saya ingin melakukan itu karena saya mungkin ingin memport game ke platform lain nanti.
Ada ide?
android
opengl-es
text-rendering
diguncang
sumber
sumber
Jawaban:
Android SDK tidak dilengkapi dengan cara mudah untuk menggambar teks pada tampilan OpenGL. Meninggalkan Anda dengan opsi berikut.
sumber
Rendering teks ke tekstur lebih sederhana dari apa yang tampak seperti demo Teks Sprite, ide dasarnya adalah menggunakan kelas Canvas untuk merender ke Bitmap dan kemudian meneruskan Bitmap ke tekstur OpenGL:
sumber
Saya telah menulis tutorial yang memperluas jawaban yang diposting oleh JVitela . Pada dasarnya, ia menggunakan ide yang sama, tetapi alih-alih merender setiap string ke tekstur, ia merender semua karakter dari file font ke tekstur dan menggunakannya untuk memungkinkan rendering teks dinamis penuh tanpa perlambatan lebih lanjut (setelah inisialisasi selesai) .
Keuntungan utama metode saya, dibandingkan dengan berbagai generator atlas font, adalah Anda dapat mengirimkan file font kecil (.ttf .otf) dengan proyek Anda alih-alih harus mengirimkan bitmap besar untuk setiap variasi dan ukuran font. Itu dapat menghasilkan font kualitas sempurna pada resolusi apa pun hanya menggunakan file font :)
The tutorial termasuk kode lengkap yang dapat digunakan dalam setiap proyek :)
sumber
Menurut tautan ini:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
Anda dapat merender Tampilan apa pun ke bitmap. Mungkin layak untuk mengasumsikan bahwa Anda dapat mengatur tampilan sesuai kebutuhan (termasuk teks, gambar, dll.) Dan kemudian merendernya menjadi Bitmap.
Menggunakan kode JVitela di atas Anda harus dapat menggunakan Bitmap itu sebagai tekstur OpenGL.
sumber
Lihatlah CBFG dan port Android dari kode pemuatan / rendering. Anda harus dapat memasukkan kode ke proyek Anda dan langsung menggunakannya.
CBFG - http://www.codehead.co.uk/cbfg
Android loader - http://www.codehead.co.uk/cbfg/TexFont.java
sumber
Saya melihat contoh teks sprite dan itu terlihat sangat rumit untuk tugas seperti itu, saya mempertimbangkan rendering ke tekstur juga, tapi saya khawatir tentang kinerja yang mungkin menyebabkan hit. Saya mungkin hanya harus pergi dengan pemandangan dan khawatir tentang porting ketika tiba saatnya untuk menyeberangi jembatan itu :)
sumber
Lihatlah contoh "Teks Sprite" dalam sampel GLSurfaceView .
sumber
IMHO ada tiga alasan untuk menggunakan OpenGL ES dalam game:
Menggambar teks selalu menjadi masalah dalam desain game, karena Anda menggambar sesuatu, jadi Anda tidak dapat memiliki tampilan dan nuansa aktivitas yang umum, dengan widget dan sebagainya.
Anda dapat menggunakan kerangka kerja untuk menghasilkan font Bitmap dari font TrueType dan merendernya. Semua kerangka kerja yang saya lihat beroperasi dengan cara yang sama: menghasilkan koordinat titik dan tekstur untuk teks dalam waktu menggambar. Ini bukan penggunaan OpenGL yang paling efisien.
Cara terbaik adalah dengan mengalokasikan buffer jarak jauh (objek buffer vertex - VBO) untuk simpul dan tekstur di awal kode, menghindari operasi pemindahan memori yang malas dalam waktu penarikan.
Ingatlah bahwa pemain game tidak suka membaca teks, jadi Anda tidak akan menulis teks yang dibuat secara dinamis lama. Untuk label, Anda dapat menggunakan tekstur statis, meninggalkan teks dinamis untuk waktu dan skor, dan keduanya numerik dengan panjang beberapa karakter.
Jadi, solusi saya sederhana:
Operasi draw cepat, jika Anda menggunakan buffer statis jarak jauh.
Saya membuat file XML dengan posisi layar (berdasarkan persentase diagonal layar) dan tekstur (statis dan karakter), dan kemudian saya memuat XML ini sebelum rendering.
Untuk mendapatkan tingkat FPS yang tinggi, Anda harus menghindari menghasilkan VBO pada waktu undian.
sumber
Jika Anda bersikeras menggunakan GL, Anda dapat merender teks menjadi tekstur. Dengan anggapan bahwa sebagian besar HUD relatif statis, Anda tidak perlu terlalu sering memuat tekstur ke memori tekstur.
sumber
Lihatlah
CBFG
dan port Android dari kode pemuatan / rendering. Anda harus dapat memasukkan kode ke proyek Anda dan langsung menggunakannya.CBFG
Android loader
Saya memiliki masalah dengan implementasi ini. Ini hanya menampilkan satu karakter, ketika saya mencoba mengubah ukuran bitmap font (saya perlu huruf khusus) gagal total :(
sumber
Saya telah mencari ini selama beberapa jam, ini adalah artikel pertama yang saya temui dan meskipun memiliki jawaban terbaik, jawaban paling populer menurut saya tidak tepat sasaran. Tentu untuk apa yang saya butuhkan. Jawaban weichsel dan shakazed tepat pada tombolnya tetapi sedikit dikaburkan dalam artikel. Untuk menempatkan Anda di proyek. Di sini: Cukup buat proyek Android baru berdasarkan sampel yang ada. Pilih ApiDemos:
Lihat di bawah folder sumber
ApiDemos/src/com/example/android/apis/graphics/spritetext
Dan Anda akan menemukan semua yang Anda butuhkan.
sumber
Untuk teks statis :
Untuk teks panjang yang perlu diperbarui sesekali:
Untuk angka (diformat 00.0):
Dalam acara onDraw Anda, hanya perbarui variabel nilai yang dikirim ke shader.
Kode di atas berfungsi untuk atlas tekstur di mana angka mulai dari 0 pada kolom ke-7 dari baris ke-2 font atlas (tekstur).
Lihat https://www.shadertoy.com/view/Xl23Dw untuk demonstrasi (dengan tekstur yang salah)
sumber
Di OpenGL ES 2.0 / 3.0 Anda juga dapat menggabungkan OGL View dan elemen-UI Android:
Buat tata letak activity_gl.xml:
Untuk memperbarui elemen dari utas render, dapat menggunakan Handler / Looper.
sumber