Ilusi ruang: bagaimana Spiderman baru membuat kamar tanpa geometri


Dalam permainan Marvel Spider-Man yang baru-baru ini dirilis, banyak bangunan memiliki interior di luar jendela. Mereka tampak hebat, tetapi tampaknya mereka diimplementasikan menggunakan rendering licik - geometri interior tidak benar-benar ada dan dihasilkan oleh shader. Saya tidak melihat pernyataan resmi Insomnia tentang bagaimana mereka melakukannya, tetapi berdasarkan pada bagaimana efeknya terlihat, sangat mungkin bahwa teknik pemetaan interior yang saya buat pada tahun 2007 saat mengerjakan disertasi dilaksanakan. Saya tidak menulis tentang itu di blog sebelumnya, jadi sekarang adalah saat yang tepat untuk menjelaskan shader kecil yang penasaran yang saya buat.

Mari kita mulai dengan menonton gameplay Marvel's Spider-Man. Game ini terlihat sangat mengagumkan. Situs web Kotaku merekam video terpisah di windows:


Seperti yang dapat Anda lihat pada sekitar 40 detik video, pada kenyataannya, kamar-kamar itu bukan bagian dari geometri: di mana jendelanya seharusnya berada, pintunya berada. Selain itu, melihat dalam satu ruangan dari berbagai sudut bangunan, kita melihat interior yang berbeda. Dalam beberapa kasus, bahkan ada tembok di sekitar sudut bangunan. Semua ini membuat kita mengerti bahwa kamarnya ditiru. Namun, dari sudut pandang perspektif, mereka ditampilkan dengan benar dan memiliki kedalaman nyata. Saya pikir kelemahan kamar seperti itu tidak terlalu penting selama pertandingan, karena pemain biasanya tidak mempelajari kamar begitu dekat: interior hanya latar belakang, dan bukan subjek studi yang cermat. Saya percaya bahwa cara menciptakan kamar ini menambah kedalaman dan kehidupan kota tanpa menghabiskan terlalu banyak sumber daya.


Untuk menghemat sumber daya, bangunan dalam game sering tidak memiliki interior, seperti yang dapat dilihat pada tangkapan layar dari GTA V

Pertama-tama, saya ingin menjelaskan bahwa posting saya bukan keluhan: Saya senang bahwa peralatan saya digunakan dalam permainan skala besar dan sama sekali tidak menuduh Insomniac mencuri. Seperti yang saya katakan di publikasi pertama tentang pemetaan interior, akan menjadi suatu kehormatan bagi saya jika seseorang menggunakan teknik ini. Jika Insomniac benar-benar memanfaatkan ide saya dalam tekniknya, maka saya pikir itu hebat. Jika dia tidak menggunakannya, maka sepertinya dia datang dengan sesuatu yang anehnya mirip. Maka saya akan tertarik pada bagaimana ini dilakukan.

Jadi bagaimana cara kerja pemetaan interior? Idenya adalah bahwa bangunan itu sendiri tidak mengandung geometri tambahan. Interior hanya ada di shader. Shader ini melakukan raycasting dengan dinding, langit-langit dan lantai untuk menghitung apa yang harus dilihat pemain di interior.


Dari kiri ke kanan: hanya jendela dengan pantulan, jendela dengan Pemetaan Interior, model rangka gambar - Pemetaan Interior tidak menambahkan poligon apa pun.

Sinar yang digunakan untuk raycast hanyalah sinar dari kamera ke piksel. Pixel yang kami render terletak di bagian luar gedung, jadi kami hanya menggunakan bagian balok setelah piksel, karena ini adalah bagian yang sebenarnya berada di dalam bangunan.

Raycasting mungkin tampak seperti operasi yang rumit dan mahal, tetapi dalam kasus khusus ini sebenarnya sangat sederhana dan cepat. Caranya adalah Anda dapat menambahkan batasan sederhana: dengan pemetaan interior, langit-langit dan lantai berada pada jarak yang konstan. Mengetahui hal ini, kita dapat dengan mudah menghitung ruangan tempat kita berada dan di mana lantai dan langit-langit berada di ruangan ini. Langit-langit dan lantai itu sendiri adalah bidang geometris yang tak berujung. Menghitung persimpangan antara bidang yang tak terbatas dan sinar hanya membutuhkan beberapa langkah dan menghabiskan sedikit sumber daya.


Kamar ini memiliki 6 pesawat: langit-langit, lantai, dan 4 dinding. Namun, kita hanya perlu mempertimbangkan mereka bertiga, karena kita tahu ke arah mana kita mencari. Misalnya, jika kita melihat ke atas, maka kita tidak perlu memeriksa lantai di bawah, karena kita akan melihat langit-langit di atas. Demikian pula, alih-alih 4 dinding, kita hanya perlu mempertimbangkan dua ke arah yang kita cari.

Untuk menentukan apa yang kita lihat, kita perlu menghitung persimpangan sinar dengan masing-masing dari tiga bidang ini. Persimpangan dengan sinar yang paling dekat dengan kamera memberi tahu kita pesawat mana yang kita lihat dalam piksel ini. Kemudian kita menggunakan titik persimpangan sebagai koordinat tekstur untuk menemukan warna piksel. Misalnya, jika balok memotong pada posisi (x, y, z) dengan langit-langit, maka kita menggunakan (x, y) sebagai tekstur yang terkoordinasi dan diabaikan z.

Di sini saya menambahkan optimisasi yang baik: bagian dari perhitungan persimpangan untuk masing-masing dari tiga pesawat dapat dilakukan secara bersamaan. Shader yang digunakan bekerja dengan float4 pada kecepatan yang sama dengan float, jadi berkat pengemasan variabel yang cerdas, dimungkinkan untuk memotong ketiga sinar dengan pesawat pada saat yang bersamaan. Ini menyelamatkan saya beberapa sumber daya dan membantu mencapai frame rate tinggi dengan pemetaan interior bahkan pada tahun 2007. Saya diberi tahu bahwa kartu video modern dengan float bekerja lebih cepat daripada dengan float4; itu berarti bahwa pada perangkat keras saat ini optimasi ini tidak lagi berfungsi.


Pemetaan Interior tanpa tekstur jendela menunjukkan bahwa kamar ditampilkan dengan perspektif dan tekstur yang benar, meskipun geometri tambahan tidak diperlukan.

Anda dapat mempelajari lebih lanjut tentang pemetaan interior di artikel saya . Artikel ini diterbitkan di Computer Graphics International Conference pada 2008. Memiliki publikasi yang ditinjau sejawat ini adalah aplikasi pertama saya (dan satu-satunya) untuk gelar ilmuwan yang bangga. Artikel ini juga menjelaskan eksperimen tambahan untuk menambahkan detail, misalnya, mengubah jarak antara dinding untuk kamar dengan ukuran yang tidak sama dan secara acak memilih tekstur dari atlas tekstur untuk variabilitas ruangan yang lebih besar. Ini juga menjelaskan secara rinci dua variasi yang ditunjukkan pada gambar di bawah ini.


Pencahayaan di kamar dapat dinyalakan dan dimatikan secara dinamis untuk mensimulasikan perubahan siang dan malam. Ini dilakukan dengan menggunakan tekstur suara dari mana kita membaca, menggunakan indeks ruang sebagai koordinat tekstur.

Karena kami hanya memancarkan sinar di pesawat, semua kamar adalah kotak sederhana dengan tekstur. Semua furnitur di ruangan akan berada di tekstur, yang berarti tetap rata. Di Spiderman, ini terlihat ketika Anda mendekati kamera: meja di kamar sebenarnya tekstur datar di dinding. Seperti yang Anda lihat pada gambar di bawah, kami dapat melengkapi teknik kami dengan satu atau lebih lapisan tekstur tambahan per kamar, tetapi ini terkait dengan biaya kinerja tambahan.


Dengan melakukan raytracing pada bidang lain yang sejajar dengan permukaan luar bangunan, Anda dapat menambahkan furnitur dan orang ke ruangan. Namun, mereka akan tetap datar.

Setelah publikasi posting ini, salah satu programmer Simcity (2013) mengatakan kepada saya bahwa teknik pemetaan interior juga digunakan dalam game ini. Di dalamnya, dia terlihat sangat keren, dan para pengembang merekam video yang bagus tentang itu. Mereka menyempurnakan ide asli saya dengan menyimpan semua tekstur dalam satu tekstur dan menambahkan ruang dengan kedalaman berbeda. Bagian pemetaan interior dimulai pukul 01:00 .:


Jika Anda ingin menjelajahi teknik ini lebih dalam, Anda dapat mengunduh demo pemetaan interior saya dengan kode sumber. Jika Anda bekerja di Unreal Engine 4, Anda dapat menemukan pemetaan interior sebagai fungsi engine standar dalam bentuk fungsi InteriorCubeMap.

Setelah bertahun-tahun, senang akhirnya melihat bahwa teknik pemetaan interior saya digunakan dalam produksi video game skala besar! Jika Anda terbiasa dengan game yang menggunakan sesuatu yang serupa, tuliskan tentang hal itu kepada saya.

Source: https://habr.com/ru/post/id424827/


All Articles