Teks Independen Resolusi Rendering


11

Saya membutuhkan cara untuk menggambar resolusi teks independen di game saya. Artinya, saya harus dapat memperbesar teks dan tidak pernah melihat artefak piksel.

Adakah yang bisa membuat saran tentang bagaimana saya bisa melakukannya?


Saya akan berasumsi Anda perlu melihat metode font berbasis vektor, daripada font raster, yang bisa menjadi titik awal. Saya bukan ahli dalam hal ini, jadi saya akan membiarkan seseorang yang tahu jawabannya.
Ray Dey

Jawaban:


7

Ada tiga cara umum untuk melakukannya. Ini bukan benar-benar tentang menghilangkan artefak sepenuhnya - yang tidak mungkin, kecuali jika Anda memiliki memori atau waktu prosesor yang tidak terbatas - melainkan bagaimana meminimalkannya dengan cara yang sesuai dengan kode dan platform target yang ada.

Pertama, cukup gunakan rasterizer font Anda - biasanya FreeType - untuk merasterisasi font pada ukuran yang Anda inginkan saat Anda memperbesar. Ini akan terlihat bagus dalam screenshot, tetapi ini sangat lambat. Anda bisa mengatasi kelambatan dengan ukuran caching, tetapi kemudian menjadi sangat haus akan memori. Ini juga tidak terlihat hebat dalam gerakan, karena membuat mesin terbang terlihat bagus untuk tampilan statis memerlukan penskalaan mereka tidak seragam. Namun, ini merupakan opsi jika Anda menggunakan platform dengan memori yang cukup (seperti PC) dan skala Anda terbatas pada kisaran kecil, seperti 10px hingga 30px. Metode ini juga tidak mengakui banyak eye-candy dengan sendirinya.

Kedua, Anda dapat menyimpan teks Anda sebagai mesh. Beberapa perpustakaan ada untuk melakukan ini, seperti GLTT , atau Anda bisa menulis sendiri. Sekarang Anda tidak lagi memiliki artefak piksel, tetapi Anda akan memiliki artefak poligonal jika Anda memperbesar sangat dekat - seperti halnya jaring lainnya dalam gim 3D. Mesh text mengakui banyak eye candy karena vertex shaders dapat diterapkan dan mesh dapat disatukan dengan gambar dunia lain yang Anda lakukan. Ini cukup ringan pada memori dan CPU, dan mudah untuk mengukur biaya karena hanya mesh standar. Ini bisa menyusahkan untuk diintegrasikan ke dalam pipa rendering 2D berbasis sprite normal.

Ketiga, Anda bisa menggunakan bidang jarak dalam kombinasi dengan pixel shader . Ini adalah teknik yang relatif baru yang saat ini populer, menggunakan shader sederhana untuk mencicipi tekstur premade dan pemfilteran bilinear "bebas" pada kartu video Anda untuk meningkatkan mesin terbang dengan bersih. Ini menggunakan sedikit dan memori yang mudah diprediksi dibandingkan dengan metode lain - tekstur 0,5MB hingga 1MB per set karakter per font. Ini cocok dengan baik ke jaringan rendering berbasis sprite karena berbasis sprite; setiap mesin terbang masih quad bertekstur. Itu memang menghasilkan artefak pixel, tetapi sangat sedikit dibandingkan dengan metode lain yang skala tekstur. Ada juga fungsi mundur tetap jika pixel shaders tidak tersedia, tetapi teks berakhir sangat alias. Karena pengambilan sampel dilakukan dalam pixel shader itu mengakui beberapa eye candy, seperti menguraikan dan membayangi, murah.


3

Ada juga artikel penelitian dari Microsoft Research oleh Loop dan Blinn, tentang rendering resolusi kurva independen menggunakan shader. Disarankan menggunakan teknik yang disajikan untuk membuat teks TrueType dalam resolusi yang independen.


1

Anda harus membuat karakter font dari kombinasi kurva dan garis, yang kemudian dikonversi menjadi geometri dengan tingkat detail yang sesuai saat runtime.

Untungnya sebagian besar font sudah dibangun dari kurva bezier. Untuk mendapatkan data kurva, Anda hanya perlu menggunakan fungsi Windows GetGlyphOutline () standar untuk mengekstraknya.

Saya tidak yakin apakah Anda bisa mendapatkan data kurva itu dari C # tanpa PInvoke.


1
Untuk membuat lintas-platform ini dan tidak khawatir tentang hal-hal PInvoke, menurut saya Anda dapat menulis alat untuk membuang data yang dibaca GetGlyphOutline (lihat pertanyaan SO ini ) ke beberapa format kustom, dan kemudian miliki beberapa file I / O sederhana dalam kode permainan untuk hanya memuat data mesin terbang kustom yang disimpan.
Ricket

0

Anda mungkin ingin melihat freetype. Saya tidak tahu apakah itu tersedia di platform Anda atau jika lisensi berlaku tetapi itu adalah perpustakaan open source yang sangat bagus untuk rendering tipe-benar dan font vektor lainnya. Saya percaya mereka harus melakukan beberapa pengacara pintar menghindari kode untuk mendapatkan font untuk memberikan cara yang menyenangkan secara estetika. Cara mengetik yang benar melibatkan kode byte pada kurva untuk memberikan petunjuk kepada renderer sehingga fitur font yang penting (seperti vertikal dan serif) tidak menjadi kabur karena mereka akan menggunakan anti-aliasing naif standar. Teknik itu memiliki hak paten sehingga orang-orang bebas harus membuat sesuatu yang melakukan pekerjaan itu dan tidak memohon pada pengacara-binatang buas yang mengerikan (saya pikir) Apple. Ngomong-ngomong, kesampingkan hukum di samping, coba lihat ke jenis bebashttp://freetype.sourceforge.net/index2.html

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.