How I Almost Real-Time Race Trails pada tahun 1997

Saya ingin membagikan ingatan saya tentang upaya saya untuk membuat "mesin grafis 3D" "lakukan sendiri" hampir di era pra-Internet (seolah-olah dia sudah ada di suatu tempat, tentu saja, tetapi saya sebenarnya tidak memilikinya). Tidak ada Amerika yang dapat ditemukan, revolusi juga tidak terjadi, tetapi ada banyak upaya, siksaan dan penggemar. Selama bertahun-tahun, ingatan akan banyak peristiwa dihapus, detail menghilang, tayangan memudar - dengan banyak perjalanan, kotak disket hilang dan tidak ada artefak dari peristiwa yang dijelaskan.

Latar belakang


4 tahun terakhir sekolah berlangsung di sekolah pendidikan jasmani Omsk, di mana seorang anak (kecuali pendidikan jasmani dan sumpah) diajarkan bahasa C, yang, tumpang tindih dengan minat pada grafik dalam permainan, memungkinkan saya untuk menulis sesuatu sendiri, mencoba untuk menyadari apa yang saya lihat dalam permainan waktu itu. . Sudah sulit untuk mengejutkan dengan grafis 2D, tetapi Wolf 3D membuat saya terhenti untuk sementara waktu. Salah satu kawan senior berkata "ya, semuanya ada di jeruji", dan ini memungkinkan saya untuk pindah dari tanah. Kemudian saya menyadari bahwa algoritma Bresenham dapat diterapkan untuk penskalaan kolom gambar dan semacam parodi di Wolf3D mulai bekerja. Saya sama sekali tidak berusaha untuk membuat sesuatu yang dapat dimainkan (apa yang vulgar!), Saya menyukai proses penerapan algoritma grafis, perasaan bahwa Anda tahu bagaimana hal itu dilakukan dan dapat melakukannya. Pada ujian akhir, saya memilih untuk mengambil informatika dan menyajikan bagian "teoretis" kepada para guru, sangat mengejutkan mereka dengan kehadiran yang praktis. Tapi seminggu sebelum ujian, saya melihat Descent - permainan tiga dimensi nyata dengan tekstur. Itu adalah sesuatu yang mustahil, saya tahu ada 3DS, tetapi di sana untuk membuat kartun banyak waktu diperlukan, dan kemudian terbang tepat di depan mata kami.

Pada wisuda, alih-alih berdebar seperti anak-anak normal, saya berdiskusi dengan teman-teman Duke Nukem (dia juga seorang kolumnis), yang sangat saya sukai karena humor dan variasinya. Dan kemudian seorang pria mengatakan kepada saya "lihat Quake." Ketika saya melihat kwaku, saya memutuskan bahwa itu cukup untuk menahannya, tidak mungkin, itu adalah grafik 3D nyata, tidak ada kolom - dan saya benar-benar tidak mengerti bagaimana ini dilakukan.

Saya ahli dalam bidang geometri


Sekarang Anda dapat menemukan informasi dalam 5 menit, tetapi apa yang harus dilakukan? Saya punya buku tentang grafik 3D, tetapi tidak menjelaskan pertanyaan sama sekali. Dalam "Duma", semua wajah menghidupkan layar dalam trapesium, menarik tekstur dilakukan dengan meregangkan kolom. Tetapi pada saat yang sama, saya kehilangan fakta bahwa non-linearitas muncul secara horizontal, dan pada kenyataannya gambar dalam Duma tidak sepenuhnya realistis. Jadi saya melewatkan prinsip utama grafik 3D, yang ditemukan oleh Newton - " gariskan itu ." Apa yang akan menjadi sumber dari semua masalah dan pelemparan berikutnya.

Karena kita sudah tahu cara menggambar trapesium, mari "menggambar" di layar setiap segi segitiga. Ya, itu tidak dapat dilukis dengan kolom, tetapi geometri bukanlah hal yang sangat sulit, mari kita lewati sebuah balok dari kamera melalui setiap piksel layar dan temukan di mana ia memotong wajah. Ini praktis ray tracing, hanya lite! Siswa mana pun akan menulis rumus ini dalam 5 menit. Persamaan garis:

 vecx=k(xs,ys,z0)=k vecS

dimana xs, ysini adalah koordinat piksel pada bidang layar, z0ini adalah jarak dari kamera ke bidang layar (kamera nol dari sistem referensi), k- parameter
Persamaan bidang:

( vecn, vecx)=D

di mana n normal, maka parameter (dan karenanya koordinat) mudah ditemukan:

k= fracD( vecn, vecs)


Nah, betapa mudahnya, datang ke dunia sakitnya perpecahan. Komputer terlipat dengan baik, berlipat ganda dengan lumayan (tidak lebih dari penambahan dan pergeseran), tetapi pembagian ... Pembagian pada Pentium saya membutuhkan 46 siklus clock. Bahkan jika 320 hingga 200, bahkan jika tidak lebih, maka untuk setiap frame Anda membutuhkan 3 juta ukuran. Dan hanya ada 100 rami saya, yang berarti Anda tidak bisa mendapatkan lebih cepat dari 30 fps pada prinsipnya. Dan jika resolusi meningkat 2 kali lipat? 7 fps? Tapi penggila muda itu tidak malu.

Nah, katakanlah kita menghitung titik persimpangan dengan wajah, maka kita perlu menyelesaikan dua masalah:

  1. putuskan apakah akan menggambar wajah dalam piksel ini, atau jika wajah lain tumpang tindih dengannya
  2. temukan koordinat tekstur

Sortir pohon


Tentu saja, saya tahu tentang Z-buffer. Tapi percayalah, 99% orang yang tahu Z-buffer salah membayangkannya, seperti yang saya bayangkan salah (akan ada penjelasan). Bagaimanapun, saya ingin menghindari perhitungan yang tidak perlu (divisi terlalu berat), jadi saya memutuskan untuk menggunakan teknik lain, baca di buku - pohon partisi ruang biner, mereka juga pohon-pohon BSP. Saya selalu menyukai pohon, metode menyortir berdasarkan pohon selalu membuat saya terpesona dengan keajaibannya, dan inilah variasinya - saya menukar 8 jam terus menerus, tetapi saya bisa!

Metode ini memungkinkan penyortiran wajah (pada saat yang sama, beberapa wajah dipotong menjadi beberapa bagian) sehingga ketika menampilkan, wajah "dekat" digambar terlebih dahulu, kemudian yang jauh. Oleh karena itu, jika, ketika menggambar wajah, saya melihat bahwa piksel sudah diambil, maka kita dapat dengan aman beralih ke piksel berikutnya, masalah urutan terpecahkan, masih untuk menarik tekstur.

Tekstur lem wallpaper


U, V koordinat? Tidak, saya belum pernah mendengar. Tapi jangan salahkan saya, karena ketika Anda merekatkan wallpaper Anda tidak berpikir sama tentang mereka. Anda berpikir bahwa Anda memiliki satu sisi wallpaper (vektor tekstur horizontal), di sini Anda memiliki ujung wallpaper (vektor tekstur vertikal), Anda meletakkannya di dinding! Jadi saya, untuk setiap wajah, mulai 2 vektor untuk tepi tekstur dan mengetahui titik persimpangan, saya menemukan koordinat di dalam tekstur.

Kami membutuhkan plot dan efek.


Rendering didapat, meskipun tidak cepat, tetapi didapat! Saya dapat grafis 3D! Tapi apa yang akan kita render? Kami membutuhkan semacam plot, beberapa model, kami membutuhkan beberapa jenis suara.

Pejalan kaki atau selebaran? Pejalan kaki ini pergi dan tidak memungkinkan untuk merasakan semua keindahan 3D, pasti lalat! Akan ada Keturunan kita.

Saya membuat platform, meletakkan beberapa bangunan di atasnya, menarik tekstur dengan jendela di atasnya, membuat air mancur wajah (sepertinya keren). Apa yang akan kita tembak? Mereka menembak paku dalam gempa, itu tidak keren. Untuk beberapa alasan yang tidak diketahui oleh para ahli kultural pada saat itu, kata "baut" (yang perlu dipalu) sangat populer, dan saya menyadari bahwa kami akan menembak dengan baut - ternyata itu adalah sekrup - slotnya terlihat sangat bagus pada baut yang didorong ke dalam gedung ".

Musuh? Yah, saya tidak bisa membuat model orang, saya lakukan ... ambulans terbang, hampir kubik, hanya sedikit memiringkan kaca depannya. Tapi teksturnya tersimpan.

Kedengarannya Suara tembakan dan ledakan serta teriakan yang saya dapatkan dari mesin terbang yang saya ambil dari warcraft, soundtrack memulai akustik Orang yang menjual dunia - saya sendiri mendengarkan logam, tetapi saya merasa kasihan kepada orang tua saya, yang harus mendengarkan hal yang sama di malam hari ketika saya sedang debugging.
Di Windows 95, suara tidak tercampur, tetapi dia, manfaat dari universitas, guru memberi tahu saya tentang multithreading dan saya menulis mixer dalam aliran terpisah - keberhasilan lain (windows 98 akan dirilis dalam setahun, di mana suara dicampur sendiri dan keterampilan rahasia ini akan menjadi tidak berguna).

Apakah mungkin melakukan lebih baik? Saya memutuskan untuk menemukan kembali linierisasi dan berpikir, apa yang akan terjadi jika kita secara akurat menemukan koordinat tekstur untuk tepi garis, dan bagian dalamnya akan menjadi gila? Saya mencobanya - semuanya mulai bekerja berkali-kali lebih cepat, tetapi distorsi yang serius mulai terjadi di dekat bangunan - seperti di ruangan cermin bengkok. Koreksi perspektif - tidak, saya belum pernah mendengar.
Yah, karena saya belum pernah mendengar, tidak ada hubungannya dengan itu, dan saya menolak opsi ini.

Hampir di akhir cerita


Menjelang akhir tahun pertama, saya berkeinginan untuk menghadiri kursus khusus tentang komputer grafis dan menunjukkan semua yang ada pada guru. Mungkin kami sama-sama terkejut dengannya ketika dia menjelaskan interpolasi linier dari koordinat tekstur dan normal, perkiraan perkiraan penerangan, estimasi kesalahan perspektif dan koreksi, dan saya menunjukkan kepadanya sesuatu yang benar-benar berfungsi.

Pada tahun kedua, saya mencoba untuk mengulang semuanya berdasarkan pengetahuan baru, tetapi tahun default adalah 98, dan saya melihat gempa kedua pada akselerator 3D - itu sangat indah. Kemudian tidak ada uang sama sekali dari kata itu, akselerator itu seperti pesawat ruang angkasa, untuk beberapa alasan saya memutuskan bahwa saya tidak akan memilikinya dalam waktu dekat. Dan minat dalam pemrograman grafis mulai memudar dengan cepat - tapi saya bersemangat dengan ide pemrosesan suara. Tapi itu cerita lain

PS Koordinat tekstur nyata berubah secara nonlinier, untuk kecepatannya diganti dengan yang linier. Tetapi apa yang terjadi pada koordinat Z, dan mengapa mereka membalik Z selama transformasi? Jawaban untuk pertanyaan ini diberikan oleh Z-buffer.

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


All Articles