Cara kerja rendering game 3D: tekstur dan pemfilteran tekstur

gambar

Pada artikel ketiga tentang rendering dalam game 3D, kita akan mengetahui apa yang terjadi pada dunia 3D setelah memproses pemrosesan vertex dan meraster adegan. Texturing adalah salah satu tahapan rendering yang paling penting, meskipun faktanya hanya menghitung dan mengubah warna kotak dua dimensi dari blok multi-warna.

Sebagian besar efek visual dalam gim modern bermuara pada penggunaan tekstur yang disengaja - tanpanya, gim akan terasa membosankan dan tidak bernyawa. Jadi mari kita lihat bagaimana semuanya bekerja!

Bagian 1: pemrosesan simpul

Bagian 2: rasterisasi dan penelusuran sinar

Mari kita mulai dengan yang sederhana


Anda dapat mengambil game terlaris tiga dimensi yang dirilis tahun lalu, dan mengatakan dengan keyakinan bahwa mereka semua memiliki kesamaan: mereka menggunakan peta tekstur (atau hanya tekstur ). Ini adalah istilah yang umum bahwa ketika berpikir tentang tekstur, kebanyakan orang menyajikan gambar yang sama: kotak datar atau persegi panjang sederhana yang berisi gambar permukaan (rumput, batu, logam, kain, wajah, dll.).

Tetapi ketika digunakan dan dikombinasikan menggunakan perhitungan yang rumit, gambar sederhana seperti itu dalam adegan 3D dapat membuat gambar yang sangat realistis. Untuk memahami bagaimana ini mungkin, mari kita matikan mereka sepenuhnya dan lihat bagaimana objek dari dunia 3D tanpa tekstur akan terlihat.

Seperti yang kita lihat dari artikel sebelumnya, dunia 3D terdiri dari simpul - bentuk sederhana yang bergerak dan kemudian diwarnai. Mereka kemudian digunakan untuk membuat primitif, yang pada gilirannya dikompresi menjadi grid piksel dua dimensi. Karena kita tidak akan menggunakan tekstur, kita perlu mewarnai piksel ini.

Salah satu metode yang dapat diterapkan disebut naungan datar : warna titik pertama primitif diambil, dan kemudian warna ini diterapkan ke semua piksel yang dicakup oleh gambar dalam raster. Itu terlihat seperti ini:


Jelas, ketel terlihat tidak realistis, dan paling tidak karena warna permukaan yang tidak teratur. Warna melompat dari satu level ke level lainnya, tidak ada transisi yang mulus. Salah satu solusi untuk masalah ini adalah dengan menggunakan Gouraud shading .

Dalam proses ini, warna dari simpul diambil, setelah itu perubahan warna di sepanjang permukaan segitiga dihitung. Untuk ini, interpolasi linier digunakan . Kedengarannya rumit, tetapi dalam kenyataannya ini berarti bahwa jika, misalnya, satu sisi primitif memiliki warna 0,2 merah dan lainnya 0,8 merah, maka bagian tengah gambar akan memiliki warna di tengah antara 0,2 dan 0,8 (mis. 0,5).

Proses ini cukup sederhana, dan ini adalah keunggulan utamanya, karena kesederhanaan berarti kecepatan. Banyak game 3D lama menggunakan teknik ini karena peralatan komputasi terbatas dalam kemampuannya.


Barrett dan Cloud dalam keagungan naungan Gouraud (Final Fantasy VII, 1997)

Tetapi bahkan solusi semacam itu memiliki masalah - jika cahaya jatuh tepat di tengah-tengah segitiga, maka sudut-sudutnya (dan simpulnya) mungkin tidak membawa properti ini. Ini berarti bahwa cahaya yang diciptakan oleh cahaya bisa sepenuhnya hilang.

Meskipun arsir datar dan naungan Gouraud telah mengambil tempat yang tepat dalam alat rendering, contoh-contoh yang ditunjukkan di atas adalah kandidat yang jelas untuk peningkatan tekstur. Dan untuk memahami dengan baik apa yang terjadi ketika tekstur ditumpangkan pada permukaan, kita akan kembali ke masa ... sudah di tahun 1996.

Sejarah game dan GPU secara singkat


Sekitar 23 tahun yang lalu, id Software merilis Quake, dan itu menjadi tonggak utama. Meskipun ini bukan game pertama yang menggunakan poligon dan tekstur 3D untuk membuat lingkungan, itu pasti salah satu yang pertama menggunakannya secara efektif.

Tapi dia melakukan sesuatu yang lain juga - dia menunjukkan apa yang bisa dilakukan dengan menggunakan OpenGL (API grafik ini kemudian dalam keadaan versi pertama), dan juga sangat membantu generasi pertama kartu grafis seperti Rendition Verite dan 3Dfx Voodoo .


Puncak pencahayaan dan tekstur sederhana. Bersihkan 1996, bersihkan Gempa.

Dengan standar modern, Voodoo sangat sederhana: tidak ada dukungan grafis 2D, tidak ada pemrosesan simpul, hanya pemrosesan piksel paling sederhana. Namun, dia cantik:


Gambar: VGA Museum

Dia memiliki seluruh chip (TMU) untuk mendapatkan piksel dari tekstur dan chip lain (FBI) untuk kemudian mencampurnya dengan piksel raster. Peta dapat melakukan beberapa proses tambahan, misalnya, penerapan efek kabut atau transparansi, tetapi ini, pada dasarnya, kemampuannya berakhir.

Jika kita melihat arsitektur yang mendasari struktur dan operasi kartu grafis, kita akan melihat bagaimana proses ini bekerja.


Spesifikasi 3Dfx. Sumber: Falconfly Central

Chip FBI menerima dua nilai warna dan mencampurnya; salah satunya bisa menjadi nilai dari suatu tekstur. Proses pencampuran secara matematis cukup sederhana, tetapi sedikit bervariasi tergantung pada apa yang dicampur dan API mana yang digunakan untuk menjalankan instruksi.

Jika Anda melihat apa yang ditawarkan Direct3D kepada kami terkait dengan fungsi dan operasi pencampuran, kami akan melihat bahwa setiap piksel dikalikan terlebih dahulu dengan angka dari 0,0 hingga 1,0. Ini menentukan seberapa besar warna pixel akan mempengaruhi hasil jadi. Kemudian dua warna piksel yang diubah ditambahkan, dikurangi atau dikalikan; dalam beberapa fungsi, operasi logis dilakukan di mana, misalnya, pixel paling terang selalu dipilih.


Gambar: Mengambil blog teknologi Inisiatif

Gambar di atas menunjukkan cara kerjanya dalam praktik; perhatikan bahwa nilai alpha pixel digunakan sebagai koefisien untuk piksel kiri . Angka ini menunjukkan jumlah transparansi piksel.

Pada tahap lain, nilai kabut diterapkan (diambil dari tabel yang dibuat oleh programmer, dan kemudian perhitungan pencampuran yang sama dilakukan); melakukan pemeriksaan dan perubahan visibilitas dan transparansi; pada akhirnya, warna piksel ditulis ke memori kartu grafis.

Mengapa Anda membutuhkan perjalanan ini ke dalam sejarah? Nah, terlepas dari kesederhanaan relatif dari desain (terutama dibandingkan dengan monster modern), proses ini menggambarkan prinsip-prinsip mendasar dari texturing: kami mengambil nilai warna dan mencampurnya sehingga model dan lingkungan terlihat sebagaimana mestinya dalam situasi tertentu.

Game modern melakukan hal yang sama, satu-satunya perbedaan adalah jumlah tekstur yang digunakan dan kompleksitas perhitungan pencampuran. Bersama-sama, mereka mensimulasikan efek visual yang ditemukan dalam film, atau interaksi pencahayaan dengan bahan dan permukaan yang berbeda.

Dasar-dasar Tekstur


Bagi kami, tekstur adalah gambar 2D datar yang ditumpangkan pada poligon yang membentuk struktur 3D dalam bingkai. Namun, untuk komputer, ini hanya blok kecil memori dalam bentuk array 2D. Setiap elemen dari array menunjukkan nilai warna dari salah satu piksel dalam gambar tekstur (biasa disebut texels - tekstur piksel).

Setiap dhuwur poligon memiliki satu set dua koordinat (biasanya dilambangkan sebagai u, v ), memberi tahu komputer piksel mana dari tekstur yang terkait dengannya. Vertex itu sendiri memiliki satu set tiga koordinat ( x, y, z ), dan proses menghubungkan texels ke simpul disebut pemetaan tekstur .

Untuk melihat bagaimana ini terjadi, mari kita beralih ke alat yang telah kita gunakan beberapa kali dalam seri artikel ini - WebGL Rendering Real Time . Untuk saat ini, kami juga membuang koordinat z dari simpul dan mempertimbangkan semuanya pada bidang datar.


Dari kiri ke kanan: koordinat u, v tekstur, diikat langsung ke koordinat x, y dari simpul sudut. Pada gambar kedua, koordinat y meningkat di simpul atas , tetapi karena tekstur masih melekat padanya, itu membentang secara vertikal. Tekstur telah diubah di gambar kanan: nilai u telah meningkat, tetapi sebagai hasilnya, tekstur telah dikompresi dan kemudian diulang.

Hal ini terjadi karena, meskipun faktanya, pada kenyataannya, teksturnya telah menjadi lebih tinggi karena peningkatan nilai u , ia masih harus sesuai dengan primitif - pada kenyataannya, teksturnya diulang sebagian. Ini adalah salah satu cara untuk menerapkan efek yang sering ditemukan di game 3D: tekstur berulang. Contoh efek ini dapat dilihat dalam adegan dengan lanskap berbatu atau berumput, serta dengan dinding bata.

Sekarang mari kita ubah adegan sehingga ada lebih banyak primitif, dan kembali lagi kedalaman adegan. Tampilan lansekap klasik ditunjukkan di bawah ini, tetapi sekarang tekstur kotak disalin dan diulang untuk semua primitif.


Tekstur kotak dalam format gif aslinya memiliki ukuran 66 KB dan resolusi 256 x 256 piksel. Resolusi awal dari bagian bingkai yang dicakup oleh tekstur kotak adalah 1900 x 680, yaitu, dari sudut pandang pixel "area", area seperti itu harus menampilkan hanya 20 tekstur kotak.

Tetapi jelas bahwa kita melihat lebih dari dua puluh kotak, dan ini berarti bahwa tekstur kotak di kejauhan harus jauh lebih kecil dari 256 x 256 piksel. Memang , mereka menjalani proses yang disebut "minification tekstur" (ya, kata seperti itu ada dalam bahasa Inggris!). Sekarang, mari kita ulangi, tetapi kali ini bawa kamera lebih dekat ke salah satu laci.


Jangan lupa bahwa tekstur hanya memiliki ukuran 256 x 256 piksel, tetapi di sini kita melihat tekstur yang lebih besar dari setengah gambar dengan lebar 1.900 piksel. Tekstur ini menjadi sasaran operasi β€œpembesaran tekstur” .

Kedua proses tekstur ini terus-menerus terjadi dalam permainan 3D, karena ketika kamera bergerak di sekitar layar, model mendekati atau menjauh, dan semua tekstur yang diterapkan pada primitif harus berskala bersama dengan poligon. Dari sudut pandang matematika, ini adalah masalah kecil, pada kenyataannya, bahkan chip grafis terintegrasi yang paling sederhana dapat dengan mudah melakukan pekerjaan seperti itu. Namun, mengurangi dan memperbesar tekstur adalah tantangan baru yang perlu diatasi.

Salinan mini tekstur muncul di tempat kejadian


Masalah pertama yang harus dipecahkan untuk tekstur adalah jarak. Jika kita kembali ke gambar pertama dengan lansekap kotak, maka kotak yang terletak di dekat cakrawala sebenarnya memiliki ukuran hanya beberapa piksel. Karena itu, mencoba mengompres gambar 256 x 256 piksel dalam ruang sekecil itu tidak ada gunanya karena dua alasan.

Pertama, tekstur yang lebih kecil membutuhkan lebih sedikit memori kartu grafis, yang nyaman, karena Anda dapat mencoba memasukkannya ke dalam cache yang lebih kecil. Ini berarti bahwa lebih kecil kemungkinannya untuk dihapus dari cache, yaitu penggunaan berulang dari tekstur ini akan memberikan peningkatan kinerja, karena data akan berada dalam memori yang dekat. Untuk alasan kedua, kami akan segera kembali, karena ini terkait dengan masalah yang sama yang muncul dalam tekstur di dekat kamera.

Solusi standar untuk masalah perlunya mengompres tekstur besar menjadi primitif kecil adalah dengan menggunakan mip-textures (mipmaps) . Ini adalah versi yang diperkecil dari tekstur aslinya; mereka dapat dihasilkan oleh mesin itu sendiri (menggunakan perintah API yang sesuai) atau dibuat sebelumnya oleh desainer game. Setiap level berikutnya dari tekstur mip memiliki ukuran setengah dibandingkan dengan yang sebelumnya.

Yaitu, untuk tekstur kotak, dimensi akan menjadi: 256 x 256 β†’ 128 x 128 β†’ 64 x 64 β†’ 32 x 32 β†’ 16 x 16 β†’ 8 x 8 β†’ 4 x 4 β†’ 2 x 2 β†’ 1 x 1.


Semua tekstur mip dikemas bersama, sehingga tekstur memiliki nama file yang sama, tetapi menjadi lebih besar ukurannya. Teksturnya dikemas sedemikian rupa sehingga koordinat u, v tidak hanya menentukan texel mana yang ditumpangkan pada piksel dalam bingkai, tetapi juga dengan tekstur mip mana. Kemudian programmer menulis renderer, berdasarkan nilai kedalaman pixel dari frame, yang menentukan tekstur mip yang digunakan. Misalnya, jika nilainya sangat tinggi, maka pikselnya jauh, yang berarti Anda dapat menggunakan tekstur mip kecil.

Pembaca yang penuh perhatian dapat melihat kurangnya tekstur-mip - mereka harus membayarnya dengan meningkatkan ukuran tekstur. Tekstur asli kotak adalah 256 x 256 piksel, tetapi seperti yang Anda lihat pada gambar di atas, tekstur dengan tekstur mip sekarang memiliki ukuran 384 x 256. Ya, ia memiliki banyak ruang kosong, tetapi tidak peduli bagaimana kami mengemas tekstur yang lebih kecil, secara umum ukuran tekstur di satu sisi akan meningkat setidaknya 50%.

Tetapi ini hanya berlaku untuk tekstur mip yang dibuat sebelumnya; jika mesin game diprogram untuk membuatnya dengan benar, peningkatannya tidak lebih dari 33% dari ukuran tekstur asli. Oleh karena itu, karena peningkatan kecil dalam jumlah memori untuk menyimpan tekstur-mip, kami mendapatkan keuntungan dalam kinerja dan kualitas visual.

Di bawah ini adalah perbandingan gambar dengan tekstur mip dinonaktifkan / diaktifkan:


Di sisi kiri gambar, tekstur kotak digunakan "apa adanya", yang menyebabkan penampilan granularitas dan apa yang disebut moire di kejauhan. Di sebelah kanan, penggunaan tekstur mip diizinkan untuk transisi yang lebih halus, dan di cakrawala tekstur kotak diburamkan menjadi warna yang seragam.

Namun, siapa yang ingin tekstur buram merusak latar belakang gim favorit mereka?

Bilinear, trilinear, anisotropic - semua ini bagiku surat Cina


Proses memilih piksel dari tekstur untuk melapisinya pada piksel dalam bingkai disebut tekstur sampel , dan dalam dunia ideal akan ada tekstur yang cocok dengan primitif yang dirancangnya, terlepas dari ukuran, posisi, arah, dan sebagainya. Dengan kata lain, mengambil sampel tekstur akan menjadi pemetaan piksel satu-ke-satu yang sederhana.

Tetapi karena ini tidak benar, ada beberapa faktor yang perlu dipertimbangkan ketika mengambil sampel tekstur:

  • Apakah teksturnya dikurangi atau diperbesar?
  • Apakah tekstur sumber atau tekstur mip?
  • Pada sudut apa tekstur ditampilkan?

Mari kita menganalisa mereka secara berurutan. Faktor pertama cukup jelas: jika teksturnya telah meningkat, maka pada primitif akan ada lebih banyak texels yang menutupi piksel pada primitif daripada yang dibutuhkan; ketika menurun, yang terjadi adalah sebaliknya - setiap texel sekarang harus mencakup beberapa piksel. Dan itu masalah.

Faktor kedua tidak menyebabkan masalah, karena mip-tekstur digunakan untuk mem-bypass masalah pengambilan sampel tekstur primitif jauh-jauh, jadi satu-satunya tugas adalah menampilkan tekstur pada sudut. Dan ya, ini juga masalah. Mengapa? Karena semua tekstur adalah gambar yang dihasilkan untuk melihat "ketat di depan". Berbicara dalam bahasa matematika, tekstur permukaan normal cocok dengan nominal permukaan tempat tekstur saat ini ditampilkan.

Oleh karena itu, jika texels terlalu sedikit atau terlalu banyak, atau mereka terletak pada suatu sudut, maka diperlukan proses tambahan yang disebut "penyaringan tekstur" . Jika proses ini tidak digunakan, maka kami mendapatkan ini:


Di sini kami mengganti tekstur kotak dengan tekstur dengan huruf R, untuk lebih jelas menunjukkan kekacauan gambar berubah tanpa menyaring tekstur!

API Grafik seperti Direct3D, OpenGL, dan Vulkan menyediakan set tipe penyaringan yang sama, tetapi gunakan nama yang berbeda untuk mereka. Bahkan, mereka semua bermuara sebagai berikut:

  • Near Point Sampling
  • Penyaringan tekstur linier
  • Penyaringan tekstur anisotropik

Bahkan, pengambilan sampel titik pengambilan sampel terdekat bukanlah filter, karena dengan itu hanya teks terdekat dari piksel tekstur yang diperlukan yang disampel (misalnya, disalin dari memori), dan kemudian dicampur dengan warna asli piksel.

Di sini penyaringan linier datang untuk membantu kami. Koordinat texel yang diperlukan u, v ditransfer ke peralatan pengambilan sampel, tetapi alih-alih mengambil texel terdekat dengan koordinat ini, sampler mengambil empat texel. Ini adalah texel yang terletak di atas, di bawah, ke kiri dan ke kanan dari texel yang dipilih dengan mengambil sampel titik-titik terdekat.

Keempat texels ini kemudian dicampur menggunakan formula dengan bobot. Di Vulkan, misalnya, rumusnya terlihat seperti ini:


T menunjukkan warna texel, di mana f adalah hasil penyaringan, dan 1-4 adalah warna dari empat texels sampel. Alpha dan beta nilai-nilai yang diambil tergantung pada seberapa jauh titik dengan koordinat u, v adalah dari tengah tekstur.

Untungnya bagi mereka yang terlibat dengan grafik 3D, ini terjadi secara otomatis dalam chip grafis. Faktanya, inilah yang dilakukan chip TMU card 3dfx TMU: mengambil sampel empat texels dan kemudian mencampurnya. Di Direct3D, proses ini memiliki nama aneh untuk pemfilteran bilinear.tetapi sejak zaman Gempa dan chip TMU, kartu grafis telah belajar bagaimana melakukan penyaringan bilinear hanya dalam satu siklus clock (tentu saja, jika teksturnya sudah terletak di memori terdekat).

Pemfilteran linear dapat digunakan bersama dengan tekstur-mip, dan jika Anda ingin menyulitkan pemfilteran, Anda dapat mengambil empat tekstur dari tekstur, dan kemudian empat lagi dari tingkat tekstur-mip berikutnya, mencampur semuanya. Dan apa namanya di Direct3D? Penyaringan trilinear . Dari mana "tiga" itu berasal dari proses ini ? Jadi kami tidak tahu ...

Metode pemfilteran terakhir yang layak disebut adalah anisotropik . Bahkan, ini merupakan peningkatan dalam proses yang dilakukan oleh penyaringan bilinear atau trilinear. Awalnya, itu menghitungtingkat anisotropi dari permukaan primitif (dan ini merupakan proses yang sangat kompleks ) - nilai ini meningkatkan perubahan dalam aspek rasio primitif karena orientasinya:


Gambar di atas menunjukkan primitif kuadrat yang sama dengan panjang sisi yang sama; tetapi secara bertahap berubah, itu berubah menjadi persegi panjang, dan lebarnya berubah lebih dari tingginya. Oleh karena itu, primitif di sebelah kanan memiliki tingkat anisotropi lebih besar daripada di sebelah kiri (dan dalam kasus kuadrat, derajatnya nol).

Banyak game 3D modern memungkinkan Anda untuk mengaktifkan pemfilteran anisotropik dan kemudian mengubah levelnya (dari 1x ke 16x), tetapi apa yang benar-benar berubah? Parameter ini mengontrol jumlah maksimum sampel texel tambahan yang diambil pada setiap sampel linier awal. Misalkan penyaringan bilinear anisotropik 8x termasuk dalam game. Ini berarti bahwa alih-alih empat nilai texel, ia akan mendapatkan 32 nilai.

Perbedaan saat menggunakan penyaringan anisotropik jelas terlihat:


Cukup naik ke gambar di atas dan bandingkan pengambilan sampel dari titik terdekat dengan maksimum 16x pemfilteran trilinear anisotropik. Luar biasa mulus!

Tetapi untuk keindahan tekstur yang halus ini Anda harus membayar dengan kinerja: pada pengaturan maksimum, pemfilteran trilinear anisotropik akan menerima 128 sampel dari tekstur untuk setiap piksel render. Bahkan dengan GPU modern terbaik, ini tidak dapat dicapai dalam satu siklus clock.

Jika Anda mengambil, misalnya, AMD Radeon RX 5700 XT, maka masing-masing blok texturing di dalam prosesor dapat menggunakan hingga 32 alamat texel dalam satu siklus clock, dan kemudian dalam siklus clock berikutnya memuat 32 nilai texel dari memori (masing-masing memiliki ukuran 32 bit), dan kemudian mencampur empat dari mereka dalam satu lagi. kebijaksanaan. Artinya, untuk mencampur 128 sampel texel menjadi satu membutuhkan setidaknya 16 siklus jam.


GPU AMD RDNA Radeon RX 5700 dengan teknologi proses 7-nanometer.

Jika kecepatan clock 5700 XT adalah 1605 MHz, maka enam belas siklus hanya membutuhkan 10 nanodetik . Melakukan siklus ini untuk setiap piksel dalam bingkai 4K menggunakan hanya satu unit tekstur hanya membutuhkan waktu 70 milidetik. Hebat, sepertinya kinerja bukan masalah besar!

Bahkan pada tahun 1996, 3Dfx Voodoo dan kartu serupa dengan cepat diatasi dengan tekstur. Paling-paling mereka bisa memberikan 1 texel dengan penyaringan bilinear per siklus, dan dengan frekuensi chip TMU 50 MHz, ini berarti bahwa 50 juta texel dapat diproses per detik. Gim yang beroperasi pada 800 x 600 dan 30 fps hanya membutuhkan 14 juta texel dengan penyaringan bilinear per detik.

Namun, ini benar hanya dengan asumsi bahwa semua tekstur berada dalam memori terdekat dan hanya satu texel yang sesuai dengan setiap piksel. Dua puluh tahun yang lalu, gagasan perlunya melapisi beberapa tekstur pada primitif benar-benar asing, tetapi hari ini adalah standar. Mari kita lihat mengapa ini semua berubah.

Tambahkan pencahayaan


Untuk memahami mengapa tekstur menjadi sangat penting, lihat adegan ini dari Quake:


Ini adalah gambar gelap, karena kegelapan adalah atmosfer permainan, tetapi kita melihat bahwa kegelapan tidak sama di mana-mana - beberapa fragmen dinding dan lantai lebih ringan daripada yang lain, yang menciptakan perasaan ringan di area ini.

Primitif yang membentuk dinding dan lantai ditumpangkan dengan tekstur yang sama, tetapi ada tekstur lain yang disebut "peta cahaya" dicampur dengan nilai-nilai texels sebelum diterapkan pada frame pixel. Pada waktu gempa, peta pencahayaan dihitung sebelumnya dan dibuat oleh mesin game. Mereka digunakan untuk menghasilkan tingkat pencahayaan statis dan dinamis.

Keuntungan penggunaannya adalah bahwa perhitungan pencahayaan yang rumit dilakukan dengan tekstur daripada simpul, yang sangat meningkatkan penampilan pemandangan dengan mengorbankan biaya kecepatan rendah. Jelas, gambarnya tidak sempurna: di lantai terlihat bahwa batas antara area yang diterangi dan bayangan sangat tajam.

Dalam banyak hal, sebuah lightmap hanyalah tekstur lain (jangan lupa bahwa semuanya adalah dataset 2D biasa), jadi adegan ini adalah salah satu contoh pertama penggunaan multitekstur. Seperti namanya, ini adalah proses di mana dua atau lebih tekstur ditumpangkan pada primitif. Penggunaan peta penerangan di Quake telah menjadi cara untuk mengatasi keterbatasan arsiran Gouraud, tetapi dalam proses meningkatkan jangkauan kemampuan kartu grafis, metode penerapan multitekstur juga telah berkembang.

3Dfx Voodoo, seperti banyak kartu lain pada zaman itu, terbatas dalam jumlah operasi yang dapat dilakukannya dalam satu rendering pass . Faktanya, sebuah pass adalah siklus rendering lengkap: dari pemrosesan simpul hingga rasterisasi frame, dan kemudian mengubah piksel dan menuliskannya ke buffer frame yang sudah jadi. Dua puluh tahun yang lalu, game hampir selalu menggunakan rendering satu arah.


Nvidia GeForce 2 Ultra, sekitar akhir tahun 2000. Gambar: Wikimedia

Ini terjadi karena pemrosesan simpul kedua hanya untuk menerapkan tekstur tambahan terlalu mahal dalam hal kinerja. Setelah Voodoo, kami harus menunggu beberapa tahun ketika kartu grafis ATI Radeon dan Nvidia GeForce 2 muncul, mampu melakukan multitekstur dalam satu pass.

GPU ini memiliki beberapa unit tekstur di area pemrosesan piksel (yaitu, dalam pipa ), sehingga mendapatkan texel dengan penyaringan bilinear dari dua tekstur terpisah menjadi tugas yang paling sederhana. Ini semakin meningkatkan popularitas peta pencahayaan dan memungkinkan game menjadikannya sepenuhnya dinamis, mengubah nilai pencahayaan tergantung pada kondisi lingkungan game.

Tetapi dengan beberapa tekstur, masih banyak yang bisa dilakukan, jadi mari kita menjelajahi kemampuan mereka.

Untuk mengubah ketinggian itu normal


Dalam seri artikel tentang rendering 3D ini, kami tidak berbicara tentang bagaimana peran GPU mempengaruhi keseluruhan proses (kami akan membicarakan ini, tetapi tidak sekarang!). Tetapi jika Anda kembali ke bagian 1 dan membaca tentang seluruh proses pemrosesan simpul yang kompleks, Anda mungkin berpikir bahwa ini adalah bagian paling sulit dari semua pekerjaan yang harus dilakukan GPU.

Untuk waktu yang lama, dan programmer game melakukan segala yang mungkin untuk mengurangi beban ini. Mereka harus pergi ke segala macam trik untuk memastikan kualitas gambar yang sama seperti ketika menggunakan banyak simpul, tetapi tidak memprosesnya.

Sebagian besar trik ini menggunakan tekstur yang disebut peta ketinggian dan peta normal.. Kedua konsep ini dihubungkan oleh fakta bahwa yang terakhir dapat dibuat dari yang pertama, tetapi untuk sekarang, mari kita lihat teknik yang disebut "pemetaan benjolan" .


Gambar dibuat dalam rendering demo oleh Emil Persson . Embossed texturing dimatikan / onture. Embossed texturing

menggunakan array 2D yang disebut "peta tinggi" yang terlihat seperti versi aneh dari tekstur asli. Sebagai contoh, gambar di atas menunjukkan tekstur bata realistis yang dilapisi pada dua permukaan datar. Tekstur dan peta tingginya terlihat seperti ini:


Warna-warna peta ketinggian menunjukkan normals dari permukaan batu bata (kita berbicara tentang normals di bagian 1 dari serangkaian artikel). Ketika proses rendering mencapai tahap menerapkan tekstur bata ke permukaan, serangkaian perhitungan dilakukan untuk mengubah warna tekstur bata berdasarkan normalnya.

Sebagai akibatnya, batu bata itu sendiri terlihat lebih tiga dimensi, meskipun faktanya batu bata itu tetap benar-benar datar. Jika Anda melihat lebih dekat, terutama di tepi batu bata, Anda dapat melihat keterbatasan teknik ini: teksturnya terlihat sedikit terdistorsi. Tapi ini adalah trik cepat yang memungkinkan Anda untuk menambahkan lebih banyak detail permukaan, sehingga tekstur yang timbul sangat populer.

Peta normal mirip dengan peta ketinggian, hanya warna tekstur yang normalnya sendiri. Dengan kata lain, perhitungan untuk mengubah peta ketinggian menjadi normal tidak diperlukan. Anda dapat mengajukan pertanyaan: bagaimana warna dapat menggambarkan vektor di ruang angkasa? Jawabannya sederhana: setiap texel memiliki seperangkat nilai r, g, b (merah, hijau, biru) dan nilai-nilai ini secara langsung sesuai dengan nilai x, y, z dari vektor normal.


Diagram kiri menunjukkan perubahan arah normal pada permukaan yang tidak rata. Untuk menggambarkan normals yang sama dengan tekstur datar (garis tengah), kami menetapkan warna. Dalam kasus ini, kami menggunakan nilai r, g, b (0.255.0) untuk vektor yang diarahkan lurus ke atas, dan kemudian meningkatkan nilai merah untuk kemiringan ke kiri, dan biru untuk kemiringan ke kanan.

Ingatlah bahwa warna ini tidak bercampur dengan piksel asli, ia hanya memberi tahu prosesor ke arah mana yang biasa ditunjukkan sehingga dapat dengan benar menghitung sudut antara kamera, sumber cahaya, dan permukaan bertekstur.

Keuntungan dari tekstur timbul dan peta normal sepenuhnya terlihat ketika pencahayaan dinamis digunakan dalam adegan, dan ketika proses rendering menghitung efek perubahan pencahayaan pixel demi pixel, dan tidak untuk setiap vertex. Saat ini, permainan modern menggunakan serangkaian tekstur untuk meningkatkan kualitas trik ini.


Gambar: Ryan Benno dari Twitter

Anehnya, dinding yang tampak realistis ini hanya permukaan datar, detail batu bata dan semen tidak dibuat menggunakan jutaan poligon. Sebaliknya, hanya lima tekstur dan penggunaan perhitungan yang bijaksana sudah cukup.

Peta ketinggian digunakan untuk menghasilkan pengecoran bayangan dengan batu bata, dan peta normal digunakan untuk mensimulasikan semua perubahan permukaan kecil. Tekstur kekasaran digunakan untuk mengubah cara cahaya dipantulkan dari berbagai elemen dinding (misalnya, bata halus memantulkan cahaya lebih merata daripada semen kasar).

Kartu terakhir, yang disebutkan dalam gambar AO, menciptakan bagian dari proses yang disebut ambient occlusion: kita akan memeriksa teknik ini lebih rinci dalam artikel berikut, tetapi untuk sekarang katakanlah itu membantu meningkatkan realisme bayangan.

Pemetaan tekstur adalah proses kritis.


Tekstur sangat penting ketika mengembangkan game. Ambil, misalnya, game 2019 Kingdom Come: Deliverance , RPG orang pertama yang dibuat di Bohemia pada abad ke-15. Desainer berusaha menciptakan dunia yang paling realistis pada periode itu. Dan untuk membenamkan pemain dalam kehidupan ratusan tahun yang lalu, yang terbaik adalah menerapkan lanskap yang akurat secara historis, bangunan, pakaian, gaya rambut, barang sehari-hari, dan banyak lagi.

Setiap tekstur dalam gambar ini dari game secara manual dibuat oleh seniman, dan juga berkat mesin rendering yang dikendalikan oleh programmer. Beberapa di antaranya kecil, dengan detail sederhana, dan karenanya sedikit disaring atau diproses dengan tekstur lain (misalnya, sayap ayam).


Yang lain memiliki resolusi tinggi dan banyak detail kecil; mereka menjalani penyaringan dan pencampuran anisotropik dengan peta normal dan tekstur lainnya - lihat saja wajah orang tersebut di latar depan. Perbedaan dalam persyaratan tekstur setiap objek adegan diperhitungkan oleh programmer.

Semua ini terjadi hari ini di banyak permainan, karena pemain mengharapkan tingkat detail dan realisme yang lebih tinggi. Tekstur menjadi lebih besar, dan semakin banyak yang ditumpangkan di permukaan, tetapi proses pengambilan sampel texels dan melapisinya pada piksel pada dasarnya tetap sama seperti pada hari-hari Gempa. Teknologi terbaik tidak pernah mati, berapa pun usianya!

All Articles