Bagian 1. Pendahuluan
Hai nama saya baldurk. Saya telah bekerja sebagai programmer grafis selama beberapa tahun, jadi meskipun saya bukan ahli, sepertinya saya sudah mengerti banyak tentang segala sesuatu yang berkaitan dengan bekerja dengan grafik.
Gagasan serangkaian posting ini telah lama melayang di suatu tempat di pinggiran pikiran saya, dan muncul kembali setelah membaca
artikel yang menarik dengan analisis Deus Ex terbaru .
Sepertinya saya bahwa grafik, dan terutama kompleksitas yang dicapai dalam permainan modern, adalah topik yang menarik. Sangat sedikit orang yang ingin mempelajari secara mendalam semua detailnya, tetapi saya percaya ada topik yang menarik bagi semua orang. Saya pikir sebagian besar orang yang bermain game ingin tahu tentang bagaimana efek ini atau efek itu diperoleh, atau dengan teknologi apa mereka berhasil membuat grafik yang luar biasa di beberapa game baru.
Ada banyak komponen yang diperlukan untuk membuat bahkan game 3D sederhana, belum lagi proyek seperti Watch Dogs.Saya hanya memiliki gagasan umum tentang apa yang perlu dipertimbangkan dalam artikel ini, tetapi itu akan tergantung pada topik mana yang akan menarik perhatian. Namun, ide utamanya adalah membuat deskripsi umum tentang apa yang terjadi di dalam game modern tanpa menakuti pembaca - saya akan berasumsi bahwa Anda tidak memiliki pengetahuan matematika dan pemrograman. Jika Anda tahu perbedaan antara CPU dan kartu grafis, dan Anda membedakan RAM dari hard drive, maka ini akan cukup, dan saya akan menjelaskan sisanya.
Artikel ini akan dikembangkan sesuai dengan video
walkthrough-nya Chip & Ironicus's Let's Play of Watch Dogs , untuk sedikit menyusun presentasi. Gim ini terkenal dengan grafisnya (dan pendapat tentangnya bisa sepenuhnya berlawanan), dan ada banyak aspek di dalamnya yang dapat dipertimbangkan dengan contoh-contoh terpisah. Mungkin saya akan berbicara tentang game lain.
Saya akan mulai dengan menjelaskan dasar-dasar yang hampir sama untuk setiap permainan, tetapi saya juga akan melihat beberapa teknik dan efek visual dari Watch Dogs.
Saya akan menggunakan alat yang disebut
RenderDoc , yang saya tulis di waktu luang saya. Ini digunakan untuk men-debug masalah dengan grafik - alat ini memungkinkan Anda untuk menguraikan bingkai grafik menjadi bagian-bagian, dan berkat ini kita akan melihat bagaimana hal itu berkumpul.
Animasi ini menunjukkan bagian dari bingkai yang secara bertahap dibuat dalam proses rendering dengan kartu grafis.Kebanyakan orang tahu bahwa grafik komputer (dan grafik dari video lainnya) terdiri dari serangkaian bingkai foto, masing-masing ditampilkan untuk sebagian kecil dari satu detik. Di bioskop, secara tradisional digunakan 24 frame per detik (frames per second, FPS), di televisi frekuensinya hampir sama, sekitar 24-30 frame. Dalam game, FPS dapat diubah karena banyak pekerjaan yang dilakukan di setiap frame. Penurunan frekuensi di bawah 30 tidak diinginkan, meskipun itu sering terjadi. Biasanya batas atas untuk game konsol adalah 60 FPS. Pengembang berupaya menerapkan frekuensi 30 atau 60, yang tergantung pada tujuan permainan. Pada PC, dengan tampilan dengan frame rate tinggi, Anda dapat mencapai 90, 120, atau bahkan lebih tinggi. Alasan angka-angka spesifik ini adalah sinkronisasi vertikal (vsync), yang akan kita bahas di bawah ini.
Secara mental, kita dapat melihat tugas ini dari sisi yang berlawanan - alih-alih melihat seberapa
tinggi frekuensi FPS, kita melihat betapa
sedikit waktu yang dialokasikan untuk setiap frame. Jika kita ingin game bekerja dengan frekuensi 30 FPS, maka kita hanya memiliki 33 milidetik untuk menyelesaikan semua pekerjaan yang diperlukan untuk frame. Pada 60 FPS, waktunya separuh - sekitar 17 milidetik. Bahkan untuk komputer, periode waktu ini tidak terlalu besar, mengingat jumlah pekerjaan yang perlu dilakukan. Untuk memberi Anda gambaran tentang jumlah, maka, menurut perkiraan kasar, peluru bergerak sekitar 1 meter per milidetik.
Kami terutama akan berbicara tentang PC karena platform ini terbuka, dan saya tidak dapat berbicara tentang konsol tanpa takut melanggar perjanjian non-pengungkapan (NDA). Bagaimanapun, pada dasarnya saya akan berbicara tentang apa yang tidak jauh berbeda di konsol, tetapi jika ada sesuatu yang berbeda, maka saya akan menekankan ini. Untuk platform seluler, sebagian besar perbedaan antara perangkat keras / konsol PC dan perangkat keras seluler tidak relevan dengan topik artikel saya.
Jujur, saya meletakkan gambar ini di sini sehingga Anda mengerti bahwa artikel tersebut tidak hanya memiliki teks.Tugas inilah yang menarik minat kami - kami tidak akan khawatir tentang bagaimana semua perhitungan AI dilakukan, atau bagaimana simulasi fisik dilakukan untuk memindahkan objek. Batas-batas disiplin yang disebut "pemrograman grafis" agak kabur, tetapi saya akan mengatakan bahwa pemrograman grafis dimulai ketika kita memiliki semua informasi yang diperlukan untuk membangun sebuah bingkai: kita tahu apa yang terjadi, semua tekstur dan model berada dalam memori (bukan pada disk ), animasinya sudah dianimasikan, fisika dihitung, dan kita hanya perlu menggambar bingkai yang sudah jadi untuk ditampilkan di layar.
Saya akan menambahkan bahwa saya akan mempertimbangkan gim 3D dengan render yang cukup tradisional, seperti Watch Dogs - banyak prinsip dasar yang berlaku untuk gim 2D, tetapi sedikit lebih sulit untuk menunjukkan konsep pada gim tersebut. Saya juga akan menjelaskan (terutama kepada programmer grafis) bahwa saya terutama berusaha untuk memahami, oleh karena itu, mungkin, saya akan menggunakan penjelasan yang agak meragukan jika mereka memungkinkan saya untuk mencapai tujuan saya.
Bagian 2. Terdiri dari bingkai
Sebagian besar waktu kita akan melihat hanya satu frame dan berbicara tentang blok bangunan yang digunakan game untuk membuat bingkai selesai. Juga di bagian ini akan ada beberapa gambar baru yang indah.
Ada beberapa cara agar bingkai dirangkai dari blok bangunan. Gambar selesai yang dilihat pemain tidak langsung ditampilkan. Itu diambil segera bertahun-tahun yang lalu, tetapi mesin grafis modern hampir selalu menggunakan semacam preprocessing. Sebelum menampilkan bingkai selesai pada layar, mesin grafis menggambar banyak gambar menengah dari berbagai jenis yang membantu dalam menghitung gambar akhir.
Gambar-gambar ini sangat tergantung pada jenis mesin dan teknik yang perlu diterapkan oleh programmer grafis. Misalnya, jika dia ingin sinar matahari menciptakan bayangan yang benar, maka satu jenis gambar akan dibutuhkan untuk bayangan itu. Dia mungkin juga membutuhkan pantulan yang benar pada mobil yang digerakkan pemain, dan untuk ini juga, dia membutuhkan gambar lain dengan pantulan.
Berbagai contoh gambar perantara yang digunakan dalam konstruksi bingkai Watch Dogs.Pada artikel ini, saya tidak akan mempertimbangkan masing-masing gambar yang digunakan dalam bingkai Watch Dogs, tetapi hanya yang dasar, sehingga Anda dapat mempelajari sesuatu. Ini adalah area di mana penelitian grafis terus-menerus terjadi dan teknik baru sedang muncul. Inovasi juga muncul pada level yang lebih kecil, tetapi ketika pemasaran memberi tahu Anda tentang beberapa fungsi grafis baru, biasanya mengacu pada peningkatan tersebut.
Masing-masing gambar menengah ini juga dibangun dari fragmen yang bahkan lebih kecil. Setiap objek dalam adegan atau sekelompok objek terkait dibuat secara terpisah sebagai
model bertekstur . Saat mengembangkan gim, artis membangun model ini dalam editor 3D dan membuat semua sumber daya yang diperlukan untuk mereka. Kemudian model-model ini ditempatkan di dunia menggunakan editor tingkat dan kota virtual secara bertahap dibangun dari mereka.
Mungkin, hampir semua orang tahu ini, dan jika Anda telah menyaksikan perkembangan grafik 3D real-time selama 20 tahun terakhir, Anda tahu betapa jauh lebih rumitnya model-model saat ini. Pada tahap-tahap pertama pembentukan grafik, pemetaan tekstur adalah proses yang mahal dan, jika mungkin, dibuang dengan cara melukis objek dengan warna yang sama. Tekstur dibiarkan hanya untuk elemen seperti mata atau wajah yang benar-benar membutuhkan detail.
Model 3D seluruhnya terdiri dari segitiga yang saling berhubungan yang membentuk bentuk objek. Setiap segitiga memiliki tiga titik yang disebut simpul, dan karena segitiga terhubung satu sama lain, simpul dapat dibagi oleh beberapa segitiga. Kami akan kembali ke sini nanti karena simpul dan segitiga cukup penting. Perlu juga diingat bahwa beberapa objek, misalnya, karakter atau pohon, harus dianimasikan sebelum dirender. Model dibuat dalam bentuk statis standar, dan animasi diterapkan di setiap bingkai. Kami akan kembali ke sini juga.
Ini adalah model 3D dari kepala Aiden Pierce setelah animasi. Segitiga terlihat karena ditarik datar dan tidak dihaluskan, seperti biasanya.Untuk menambahkan lebih detail ke model 3D, tekstur ditumpangkan. Tekstur adalah file gambar datar biasa, biasanya berukuran persegi atau sederhana, seperti persegi panjang dengan rasio 2: 1. Tekstur ditumpangkan pada model 3D menggunakan proses yang lebih kompleks, yang akan saya bahas secara lebih rinci di bawah ini, tetapi secara konseptual mirip dengan proses membungkus hadiah. Alih-alih pola berulang pembungkus kertas, gambar persisnya cocok dengan ukuran pembungkusnya. Jika Anda melihat model kertas untuk perakitan dengan lem, maka prinsipnya sama.
Analogi ini lebih tepat daripada yang Anda bayangkan, karena tekstur ini biasanya dibuat dengan "membuka gulungan" model 3D ke dalam flat blank, seperti yang dilakukan dengan model kertas, setelah itu tekstur digambar di atasnya. Penyebaran ini sering dilakukan secara otomatis, tetapi dalam kasus objek yang sangat kompleks dapat dilakukan secara manual.
Ini adalah tekstur yang sesuai dengan model kepala Aiden Pierce yang ditunjukkan di atas. Ada bagian untuk gigi dan lidah. Perhatikan bahwa area di atas dahinya tidak bertekstur karena tertutup secara permanen oleh Topi Baseball Legendaris Aiden Pearce ™.Catatan
Saat dibuka, beberapa bagian dari objek yang membutuhkan peningkatan lebih detail, sementara yang lain berkurang.
Sangat sering mereka berbicara tentang berbagai "kulit" model, terutama dalam hal karakter yang dapat disesuaikan. Hari ini, apa yang disebut "kulit" biasanya mengacu pada perubahan kecil dalam model - sabuk baru atau topi yang berbeda - tetapi pada awalnya istilah ini muncul karena model yang sama digunakan, tetapi teksturnya berubah (atau "kulit" - secara harfiah diterjemahkan sebagai "Skin") untuk membuat karakter yang terlihat berbeda. Bahkan hari ini, dengan bantuan tekstur seperti itu, Anda dapat membuat variabilitas NPC atau objek yang hebat, yang menghemat waktu dan uang - Anda tidak perlu membuat banyak model 3D yang unik. Pakaian yang berbeda yang Aiden bisa kenakan seringkali hanya tekstur yang berbeda dari model yang sama.
Berikut ini cuplikan singkat dari rotasi kepala model 3D. Hanya tekstur yang ditumpangkan, dan tidak lebih.Dalam bingkai yang kami pertimbangkan, ada sekitar 1700 objek yang dirender di bagian render utama. Beberapa dari mereka akan menjadi model yang sama - benda-benda seperti bunga dalam pot dan tong sampah tidak pernah benar-benar dibuat secara terpisah, ini adalah satu model atau beberapa model ditempatkan di tempat yang berbeda. Namun, perkiraan jumlah objek yang diambil untuk menyelesaikan bingkai mendekati
4700 - ini memberi kita gambaran tentang berapa banyak pekerjaan tambahan yang perlu dilakukan selain membuat semua model ini.
Mari kita lihat contoh lain dari objek - topi baseball yang dikenakan oleh Aiden.
Ini adalah model topi baseball bertekstur dan bertekstur. Dapat dilihat bahwa tekstur dibangun dari bagian-bagian terpisah yang terhubung ke model.Catatan
Visor dan bagian utama topi baseball pada tekstur tidak menyentuh, karena pemindaian bisa sangat rumit dan, jika perlu, dapat dilakukan di beberapa bagian yang berbeda. Kadang-kadang, tekstur model bentuk kompleks tanpa masalah yang terlihat dan jahitan membutuhkan keterampilan yang adil.
Prinsip yang sama yang kami lihat dengan kepala Aiden berlaku untuk topi. Bahkan, jika kita mengabaikan tekstur dan angka tertentu yang diperlukan untuk melakukan pembungkusan, maka prinsipnya selalu sama.
Untuk menunjukkan apa yang salah selama pengembangan, dan untuk menunjukkan bagaimana Anda bisa bersenang-senang saat memprogram grafik, kami dapat melakukan eksperimen kecil. Karena sebagian besar tekstur memiliki ukuran kotak standar, dan metode membungkus dan membuka tekstur pada model juga sama, mengapa tidak bermain-main dengan mereka sedikit? Apa yang terjadi jika kita menerapkan tekstur kepala Aiden ke model topi baseball?
Sudah tidak terlalu mirip dengan Topi Baseball Legendaris Aiden Pierce.Di mana ada logo pada tekstur topi baseball, telinga dan gigi terletak di tekstur kepala. Di mana ada pelindung, hanya ada rambut di tekstur kepala. Hamparannya persis sama, tetapi tekstur yang berbeda digunakan. Tentu saja, contoh ini akan menjadi kesalahan dalam gim, tetapi pikirkan tentang apa yang dapat dilakukan jika Anda menghidupkan tekstur atau membuatnya berkedip - dalam gim ini hal-hal ini digunakan untuk berbagai efek yang sekarang dapat Anda perhatikan. Secara khusus, gim Saint's Row 4 menggunakan efek serupa untuk "simulasi".
Ini juga akan berguna untuk memikirkan konsekuensi dari ini - permainan sangat hati-hati menggabungkan pasangan model dan tekstur, yaitu, model yang paling unik harus cocok dengan tekstur unik mereka sendiri.
Tentu saja, aturan ini tidak mutlak - dalam beberapa kasus, untuk menghemat ruang, tekstur adalah pola pengulangan standar yang dapat digunakan untuk banyak objek. Kumpulan benda terkait - misalnya, agen koran - dapat menggunakan tekstur yang sama untuk koran yang berbeda, dengan masing-masing koran mengambil sebagian kecil dari tekstur.
Namun demikian, ini berarti bahwa untuk membangun gambar akhir, semua blok bangunan harus ada, yaitu, sebagai hasilnya, banyak model dan tekstur yang diperlukan dapat diperoleh. Pada bagian selanjutnya, kita akan berbicara tentang mengapa beberapa aspek, seperti refleksi, sangat sulit untuk diterapkan dengan benar. Saya juga akan berbicara tentang bagaimana permainan menggunakan trik kecil untuk menghemat waktu dan sumber daya.
Bagian 3. Apa yang tidak perlu Anda gambar
Seringkali, pemrograman grafik adalah tugas menyeimbangkan selusin kendala yang berbeda untuk mendapatkan kompromi yang sempurna. Pada bagian terakhir, kita melihat bahwa setiap kali adegan dibuat, itu dikumpulkan dari banyak blok bangunan kecil - orang, mobil, rambu-rambu jalan, bangunan. Segala sesuatu yang ada di layar terdiri dari komponen individual yang perlu digambar. Ada beberapa operasi penyeimbangan halus yang akan kita bahas di sini.
Prosesor sentral dan kartu grafis bekerja bersama dalam merender bingkai. Sisa gim dieksekusi dalam CPU, sehingga memutuskan objek mana yang harus digambar dalam frame saat ini, di mana kamera melihat, dan animasi yang dimainkan. Kartu grafis adalah "pekerja keras" yang melakukan semua pekerjaan rumit yang terlibat dalam rendering piksel, itulah sebabnya mengapa itu adalah perangkat khusus yang terpisah.
Ternyata CPU dan kartu grafis memiliki batasan pada kecepatan atau jumlah perhitungan, tetapi ini adalah berbagai jenis pembatasan.
Secara umum, CPU lebih tertarik pada bagian kerjanya sendiri: berapa banyak objek yang perlu kita gambar secara total? Seberapa
berbedanya benda-benda ini - apakah 100 lampu identik, atau 100 semak / tanaman / pohon? Apakah benda-benda ini dianimasikan, apakah mereka bergerak secara dinamis, dan mana di antaranya yang statis atau tidak bergerak?
Hal pertama yang kami lakukan untuk mengurangi beban sebanyak mungkin adalah menggambar hanya apa yang terlihat di layar. Ini tampak jelas, tetapi implementasi membutuhkan kerja yang hati-hati. Jangan lupa bahwa kita membangun setiap frame dari awal, jadi
di setiap frame kita perlu melihat setiap objek dan menentukan apakah itu terlihat atau tidak. Ini berarti bahwa di setiap permainan ada kekosongan hitam di mana-mana mengikuti pemain, dan ketika dia tidak melihat benda dan orang, mereka tidak ada lagi.
Dalam animasi ini, kami memutar kamera, menunjukkan kekosongan di belakang pemain. Pemirsa yang penuh perhatian akan melihat bahwa itu tidak sepenuhnya kosong ...Sulit untuk mengembangkan aturan praktis dalam kasus ini, tetapi secara umum, Anda dapat menggambar sekitar 1000 objek di tempat kejadian tanpa khawatir tentang kurangnya ruang. Namun, jika Anda perlu membuat 5.000 objek, maka Anda harus berpikir tentang menggunakan trik. Jangan lupa bahwa di sebagian besar permainan di mana pemain dapat mengontrol kamera, kita tidak bisa tahu dari sudut mana dia akan terlihat, jadi Anda perlu menghemat ruang untuk bermanuver.
Ternyata ada banyak trik yang memungkinkan Anda untuk hampir sepenuhnya menggunakan sumber daya yang valid, dan mereka sangat penting dalam permainan seperti Watch Dogs. Semakin dekat Anda ke perbatasan dan semakin banyak kualitas visual yang bisa Anda dapatkan dari jumlah objek yang sama, semakin baik gim akan terlihat.
Bahkan jika Anda melihat apa yang ada di depan Anda dalam adegan itu, ini tidak berarti bahwa Anda harus menggambar seluruh kota. Jika ada bangunan besar di sebelah kiri atau kanan, maka semua yang ada di belakangnya menjadi tidak terlihat, jadi Anda tidak bisa menggambarnya.
Demikian pula, beberapa objek di kejauhan menjadi sangat kecil, jadi kita tidak perlu khawatir tentang menggambar tanaman kecil dan semak di kejauhan.Animasi ini menunjukkan bahwa jika Anda menyusuri jalan lebih jauh dari apa yang kita lihat, maka tidak ada apa pun di pinggir jalan, tetapi pada jarak yang jauh detailnya menjadi lebih kecil.Faktanya, masih ada banyak objek dalam adegan ini yang akan berubah menjadi tidak terlihat sebagai hasilnya. Masih banyak yang harus dieksplorasi di bidang ini dan berbagai teknik canggih harus diterapkan. Anda selalu harus membuat kompromi, tetapi jika Anda dapat menghabiskan sedikit waktu, atau menghasilkan cara yang sangat cerdas untuk menghindari rendering 100 objek dengan hampir tanpa usaha ekstra, maka kita dapat membuat adegan lebih kompleks atau lebih padat.Juga, ada masalah kecil lainnya. Dalam beberapa kasus, kita harus menggambar sebuah bangunan yang nyaris tidak terlihat di layar dan jauh melampaui itu. Memboroskan sumber daya. Kita selalu dapat membagi benda-benda ini menjadi beberapa bagian, maka setiap bagian dapat ditarik atau dilewati, yaitu, akan ada lebih sedikit limbah. Namun, sekarang kami telah meningkatkan jumlah objek yang digambar saat mereka ada di layar, dan menciptakan masalah sebaliknya!Contoh ini adalah satu dari ratusan, tetapi mudah untuk menjelaskan tentang keputusan apa yang harus dibuat dan percobaan apa yang harus dilakukan untuk menemukan titik keseimbangan yang sempurna untuk setiap permainan.Karena aksi bidikan kami dari Watch Dogs terjadi di kota, kami dapat melihatnya dari atas untuk kira-kira memahami apa yang sedang digambar. Dalam gambaran statis ini, terutama terlihat bahwa Watch Dogs melakukan pekerjaan setiap tiga bulan.Sekarang kami pindah untuk menunjukkan area yang terlihat di depan kamera (maaf untuk instalasi untuk menghemat waktu).Perkiraan visibilitas kamera ditumpangkan pada gambar. Lebar segitiga ini tergantung pada Bidang Tampilan - kadang-kadang dalam game ini adalah opsi khusus, kadang-kadang nilai konstan.Berikut ini adalah tampilan bingkai foto pemandangan, bidang pandang kamera terbatas pada warna putih.
Beberapa dari Anda sudah bisa memikirkan sedikit trik yang akan memungkinkan Anda untuk mengatasi batasan rendering sejumlah objek - mengapa tidak membuat objek kombinasi yang sangat kompleks dari segala sesuatu di area kecil, hingga daun individu? Maka menggambar 1000 objek akan lebih dari cukup.Tapi di sini kita dihadapkan pada serangkaian batasan yang sama sekali berbeda - kartu grafis memiliki kinerja terbatas, dan semakin kompleks objeknya, semakin lama waktu yang diperlukan untuk menggambar. Artinya, bahkan satu objek, jika cukup kompleks, dapat mengurangi frame rate game menjadi 20 FPS. Termasuk inilah sebabnya saya mengatakan bahwa batas jumlah objek agak kabur.Jumlah waktu yang dihabiskan untuk suatu objek tergantung pada kompleksitas dan detail dari model dan tekstur, serta pada kecanggihan pencahayaan dan bayangan. Ini juga mengapa gim yang mencoba menerapkan grafis yang lebih rumit atau canggih cenderung menggunakan adegan yang kurang rumit dan terperinci - penyeimbangan menggeser skala dalam satu arah atau lainnya, sehingga Anda dapat memberi Anda lebih banyak ruang untuk bermanuver, mengorbankan apa yang tidak begitu penting untuk gim .Ini adalah semacam peta panas, yang menunjukkan di bagian mana dari pemandangan itu ada model yang sangat kompleks. Perhatikan berapa banyak masalah yang dapat ditimbulkan oleh pohon dan vegetasi.Ada serangkaian teknik lain yang disebut "level of detail" (LOD), yang secara khusus dirancang untuk memecahkan masalah tersebut. Mirip dengan kenyataan bahwa kita dapat mengoptimalkan jumlah objek, memotong semua yang tidak perlu, kita dapat meningkatkan pasokan "kompleksitas", menghilangkan yang tidak perlu.Salah satu trik sebenarnya terkenal - ini mengubah resolusi tekstur. Topik ini biasanya bersinggungan dengan banyak orang lain, jadi saya akan mencoba menjelaskannya dengan cara yang mudah diakses.Tekstur dalam gim biasanya persegi panjang dengan ukuran yang sama dengan kekuatan dua - 512, 1024, 2048, 4096. Ada banyak alasan untuk ini, tetapi salah satu kelebihannya adalah Anda dapat mengambil tekstur ukuran 1024x1024 dan dengan mudah membuat versi ukurannya yang lebih kecil dengan ukuran 512x512 .Untuk alasan yang akan saya bahas di bawah ini, selalu diperlukan bahwa tekstur memiliki semua jenis versi yang lebih kecil. Artinya, tekstur dengan ukuran 1024x1024 akan memiliki versi lebih kecil dari 512x512, 256x256, 128x128, 64x64, 32x32, 16x16, 8x8, 4x4, 2x2 dan 1x1. Namun, salah satu keuntungan dari hal ini adalah bahwa jika objek yang jauh memiliki ukuran kecil di layar, maka menerapkan tekstur 1024x1024 padanya berarti membuang-buang sumber daya. Kita dapat menghemat dengan menggunakan versi yang lebih kecil dari tekstur yang sama.Demikian pula, bahkan objek dekat dapat dianggap tidak terlalu signifikan dan menggunakan tekstur yang lebih kecil untuknya.Catatan
Biasanya, ketika seorang pemain mendekati suatu objek, tekstur terbesar digunakan, tetapi karena kebanyakan orang telah melihat dalam permainan tertentu, ini tidak selalu terjadi dan teksturnya terlihat terlalu buram sebelum memuat. Ini biasanya terjadi karena tekstur tidak dapat dimuat dari DVD atau hard drive langsung ke memori kartu grafis untuk rendering. Paling sering ini terjadi ketika seorang pemain tiba-tiba mengubah posisinya, misalnya, selama respawn, memuat level baru atau gerakan yang sangat cepat. Dalam semua kasus lain, tekstur biasanya dimuat secara bertahap, dalam proses memindahkan pemain di seluruh dunia.
Anda juga dapat menerapkan proses penyederhanaan ini ke model-model yang digunakan dalam gim, meskipun jauh lebih sulit untuk dilakukan. Dengan membuat versi sederhana dari objek kompleks, Anda dapat memastikan bahwa pada jarak yang jauh mereka tidak menggerogoti sebagian dari persediaan kompleksitas yang terbatas.Berkat objek yang disederhanakan dan model yang dipotong, Anda dapat menghemat banyak uang dan Anda harus menggunakan pendekatan ini dalam game apa pun seperti Watch Dogs. Tetapi pada saat yang sama, itu bisa menjadi pemborosan sumber daya. Hal ini diperlukan untuk membuat keputusan yang sangat bijaksana dan seimbang tentang berapa banyak versi model yang disederhanakan diperlukan. Jika jumlah mereka terlalu sedikit, maka Anda tidak akan bisa menabung terlalu banyak, atau akan ada lompatan yang nyata dalam kualitas saat mengubahnya. Jika ada terlalu banyak, maka Anda akan membuang-buang memori dan menghabiskan waktu yang dibutuhkan manusia untuk membuat objek.Ini adalah bagaimana objek dan karakter yang kompleks terlihat pada jarak ketika mereka tidak bisa dibedakan dari versi mereka yang sangat rinci.
Saya harap sekarang Anda sudah mengetahui beberapa masalah yang diprogram oleh para pemrogram grafis, seniman, dan perancang level untuk menggabungkan grafis berkualitas tinggi dengan kecepatan tinggi. Pada konsol, persamaan ini sedikit lebih mudah untuk diselesaikan daripada di PC, karena peralatannya konstan.Pada bagian sebelumnya, saya mengatakan bahwa saya akan berbicara tentang mengapa sangat sulit untuk menerapkan refleksi dan hal-hal serupa lainnya dengan benar. Alasannya cukup sederhana - cadangan produktivitas dan sumber daya yang terus saya bicarakan tidak berubah tergantung pada apakah Anda memiliki refleksi atau tidak. Jika Anda ingin membuat refleksi yang dapat kembali menampilkan seluruh adegan, maka Anda harus mengulang semua pekerjaan yang saya bicarakan. Selain itu, pantulan sangat tergantung pada sudut di mana kita melihatnya, jadi untuk mendapatkan refleksi yang akurat untuk setiap objek pantulan, pantulan haruslah milik mereka sendiri!Ini bisa keluar dari kendali dengan sangat cepat, dan biasanya permainan yang ada pantulannya memungkinkan mereka untuk bebas atau berasumsi. Game sangat jarang membuat pantulan di lingkungan yang kompleks, maksimum yang bisa dicapai adalah cermin di kamar mandi, di mana tidak ada begitu banyak objek, kompleksitas adegannya kecil, dan karenanya Anda bisa mengeluarkan biaya tambahan. Mungkin pantulan sebenarnya dalam permainan hanya akan berada di permukaan air yang tidak rata atau bergelombang, sehingga bahkan adegan yang sangat kasar dan terperinci rendah sudah cukup untuk membuat pantulan yang meyakinkan.Biasanya sulit untuk sepenuhnya menghindari permukaan reflektif, itulah sebabnya game menggunakan gambar lingkungan langsung yang telah dirender, yang memberikan hasil "cukup baik". Tetapi mereka tidak berdiri dengan cermat, dan jika Anda melihat dengan cermat pada pantulannya, Anda akan melihat bahwa ini adalah tiruan. Ada teknik-teknik modern yang membantu menciptakan refleksi dalam kondisi tertentu, dan mungkin nanti saya akan membicarakannya, tetapi gambar yang telah dirender sebelumnya ("yang direnderkan") masih diperlukan.Gambar yang diberikan ini disebut "peta kubus". Itu tidak sepenuhnya akurat sehubungan dengan tempat di mana Aiden berdiri, tetapi cukup dekat dengannya.Watch Dogs merefleksikan waktu nyata. Saya tidak menyelidiki masalah ini secara terperinci, tetapi saya percaya bahwa mereka selalu ditampilkan ketika karakternya ada di jalan, dan terutama digunakan untuk mendapatkan refleksinya yang tepat pada mobil tempat dia duduk, untuk memperbaiki gambar dan memberinya sedikit realitas. . Karena pemain selalu fokus pada mobilnya dan lingkungan terdekatnya, fakta refleksi yang salah pada mobil lain hampir tidak terlihat.Ada banyak perkiraan yang tersedia untuk mempercepat rendering refleksi ini. Sebagai contoh, objek yang jauh lebih sedikit ditampilkan dalam refleksi daripada yang ada di adegan nyata - total sekitar 350 - dan banyak dari mereka sangat disederhanakan dibandingkan dengan versi lengkap. Saya menduga bahwa objek yang kompleks, seperti orang-orang, benar-benar dibuang terlepas dari jarak, tetapi saya belum menguji teori ini. Selain itu, tidak ada bayangan pada benda-benda ini, dan pencahayaannya sangat sederhana - hanya yang berasal dari matahari dan langit. Refleksi dibuat dari tanah seperti pada lensa "mata ikan", yaitu, refleksi bumi itu sendiri tidak mungkin, dan apa yang di sebelahnya memiliki detail yang sangat rendah.Tetapi bahkan dengan semua penyederhanaan ini, refleksi hanya mengatasi apa yang dimaksudkan. Jika Anda mengemudi di bawah rel, Anda bisa mendapatkan refleksi yang tepat dengan pandangan ke arah mobil, yang dalam praktiknya tidak akan berhasil.Keputusan ini disengaja dan tidak mudah dibuat. Stok adalah nilai konstan, jadi jika Anda meninggalkan ruang untuk refleksi ini, maka Anda perlu mengorbankan sesuatu yang lain.Berikut ini adalah pemandangan yang sangat "mencurigakan" dari pemandangan di sekitar Aiden dengan pandangan bawah, dibuat untuk refleksi. Anda dapat menavigasi sepanjang dua lampu dan rel kereta.
Ada bagian lain dari pekerjaan yang ingin saya sebutkan di sini - bayangan. Kemudian saya berencana untuk berbicara tentang cara kerja bayangan, karena ini adalah topik yang menarik, tetapi sekarang yang paling penting adalah untuk mengingat bahwa bayangan sangat mirip dengan refleksi. Setiap sumber cahaya yang menghasilkan bayangan harus membuat gambar pemandangan dari sudut pandangnya. Kali ini tidak ada banyak cara untuk menyederhanakan pekerjaan - untuk perhitungan bayangan yang benar, setiap sumber cahaya harus memiliki gambar ini.Catatan
, . , «» , . , , .
Sumber penerangan bayangan yang paling jelas dan paling signifikan adalah matahari (atau bulan, jika terjadi pada malam hari). Karena matahari sangat besar, 3-5 gambar biasanya dibuat untuk itu, dan bukan satu, seperti dalam kasus lampu depan atau lampu senter.Sayangnya, ini adalah salah satu kasus di mana Watch Dogs tidak bisa dijadikan contoh yang baik. Perhitungan bayangan dalam gim ini cukup rumit dan, menurut saya, dioptimalkan secara khusus untuk kasus bayangan di kota. Karena itu, saya lebih baik beralih ke Far Cry 4 dan mempertimbangkan perhitungan bayangan pada contoh bingkai dari game ini.Ini adalah adegan dari Far Cry 4 yang saya gunakan sebagai contoh.Berikut adalah gambar dengan informasi tentang bayangan adegan ini - masing-masing membutuhkan rendering adegan yang sama sekali baru.Karena itu, ketika kita perlu menambahkan pengecoran bayangan ke sumber cahaya, kita harus membuat adegan sekali lagi. Di sini, Anda juga dapat menggunakan beberapa perkiraan yang digunakan dalam kasus refleksi, hanya saja jauh lebih kecil. Anda dapat melewati objek kecil atau jauh, tetapi perlu diingat bahwa objek ini tidak akan muncul untuk membuat bayangan. Anda dapat membuat gambar sangat kecil, tetapi kemudian bayangannya akan kasar dan detail rendah. Biasanya tidak mungkin untuk menggunakan versi objek yang sangat disederhanakan, karena dengan begitu akan terlihat bahwa objek melemparkan bayangan pada dirinya sendiri, atau celah muncul di antara objek dan bayangannya.
Konsekuensi lain yang sangat mudah untuk dilewatkan adalah kebutuhan untuk membuat gambar bayangan untuk setiap sumber cahaya. Dalam banyak kasus, dimungkinkan untuk menyederhanakan sumber pencahayaan dengan menggabungkannya - di Watch Dogs ini terjadi dengan lampu mobil.
Ketika kedua lampu menyala, hanya satu sumber cahaya yang diambil, tetapi memiliki bentuk khusus, karena itu terlihat seperti dua sinar. Jika lampu depan memiliki bayangan, maka ini tidak begitu mudah dilakukan, dan itu akan jauh lebih terlihat - ketika pemain lewat di depan mobil, maka cahaya akan datang dari suatu tempat di antara dua lampu depan. Mungkin Anda harus memisahkan lampu depan, tetapi pada saat yang sama, tidak hanya akan ada biaya tambahan untuk menghitung bayangan, tetapi Anda juga harus menggambar pencahayaan baru.
Hal utama yang ingin saya tekankan dengan semua ini adalah kompromi. Kita tentu saja bisa menghilangkan semua perkiraan ini, tetapi kita harus menghabiskan cadangan sumber daya kita untuk ini, yaitu, mengorbankan sesuatu yang lain. Setiap pengembang game harus memutuskan apa yang penting baginya untuk fokus dalam permainan, dan apa yang paling mengesankan atau paling mengganggu pemain.
Bagian 4. Memindahkan puncak
Pada bagian ini saya akan berbicara lebih banyak tentang detail teknis dari objek animasi di tempat kejadian.
Pemrogram grafik sering berbicara tentang "grafik pipa". Grafis 3D agak mirip jalur perakitan dengan gerakan yang jelas dari satu tahap ke tahap lainnya, tetapi tidak bekerja hanya dengan satu objek pada satu waktu.
Semua kartu grafis modern memiliki kira-kira sabuk konveyor yang sama, mereka memiliki peralatan dan perangkat lunak khusus yang secara langsung di-flash "dalam silikon" untuk memaksimalkan kecepatan konveyor. Tentu saja, ada banyak variasi antara berbagai produsen dan keluarga kartu grafis, tetapi biasanya kita tidak perlu khawatir tentang
bagaimana mereka bekerja pada tingkat ini.
Catatan
Jika Anda tertarik pada bagaimana semuanya bekerja pada tingkat perangkat keras abstrak, maka saya merekomendasikan serangkaian artikel oleh Fabian Giesen di jalur pipa grafis . Seri artikel ini jauh lebih rinci dan membutuhkan lebih banyak pemahaman daripada posting saya.
Saya akan melewatkan banyak detail untuk menjelaskan prinsip-prinsip yang menarik dan penting. Di bagian ini, kita akan melihat bagian pertama dari pipa, yang disebut
Vertex Shader .
Shaders menjadi tersebar luas sekitar 16 tahun yang lalu, setelah rilis DirectX 9, di mana vertex dan pixel shaders muncul. Untuk menjelaskan apa itu shader dan membandingkannya dengan apa yang dulu, saya akan berbicara tentang pekerjaan yang mereka lakukan.
Kepala kerangka Aiden bersama kita lagi.Biarkan saya mengingatkan Anda bahwa di bagian 2, kami memeriksa model dari mana dunia game dibuat. Pola-pola ini terdiri dari titik-titik individual yang disebut simpul yang terhubung dalam segitiga. Saya mengatakan bahwa saya akan memberi tahu Anda lebih banyak tentang mereka nanti, dan sekarang saya menepati janji saya.
Karena semua yang ada di dunia gim terdiri dari simpul, semua yang perlu dilakukan dengan model ini harus dilakukan dengan simpul. Ketika datang ke kartu grafis, yang dilihatnya adalah daftar panjang simpul. Baginya, tidak ada hal seperti menjalankan animasi, atau mengayunkan daun pohon, atau konsep abstrak lainnya.
Mari kita lihat contoh sederhana dari apa yang harus kita lakukan - memindahkan dan memposisikan objek di dunia. Untuk memulainya, mari kita ambil kasus sederhana, bukan karakter.
Saat membuat objek dalam editor 3D seperti Maya dan 3D Studio Max, seniman selalu membangun dari dalam dunia mereka sendiri yang terpisah. Benda-benda ini tidak segera dibuat di rombongan Chicago, melainkan, lingkungan mereka terlihat seperti "ruang putih kosong" dari Matrix. Setiap objek terletak di tengah kekosongan absolut.
Berikut adalah lampu lalu lintas dalam permainan di suatu tempat di bawah rel, dan terletak di dunianya sendiri.Saat menyimpan ke disk, model tidak tahu di mana ia akan berada di dunia dan kapan akan diunduh dan ditransfer ke kartu grafis. Ini berarti bahwa ketika tiba saatnya untuk menggambar objek, kita perlu memindahkannya dari dunia kita sendiri ke adegan yang kita gambar. Ini terjadi dengan setiap objek digambar, dan bahkan objek tak bergerak seperti bangunan dan jembatan juga berpindah dari dunianya sendiri ke pemandangan di setiap bingkai.
Di sini kita melihat beberapa lampu lalu lintas sudah ditempatkan di adegan akhir yang sebagian dibangun.Seperti yang saya sebutkan di atas, satu-satunya hal yang dapat kita kerjakan adalah puncak. Kami tidak bisa hanya mengatakan kepada kartu grafis: "Bisakah Anda meletakkan lampu lalu lintas ini di bawah jembatan? Dan kemudian menempatkan satu lagi sedikit lebih jauh? Hebat! ”
Karena itu, alih-alih memberi tahu kartu grafis apa yang perlu dilakukan dengan objek itu sendiri, kita perlu mengatakan apa yang harus dilakukan dengan semua simpulnya. Ternyata dalam hal ini semuanya menjadi sangat sederhana. Jika kita mengubah semua simpul dengan cara yang persis sama dan mereka tetap tidak bergerak satu sama lain, maka ini mirip dengan memindahkan objek secara keseluruhan. Yang perlu kita lakukan adalah mencari tahu apa "perubahan" yang disebut transformasi.
Catatan
Perhitungan matematis dari semua ini tidak terlalu rumit, tetapi berada di luar cakupan artikel. Jika Anda sudah mempelajari aljabar linier, Anda mungkin tahu semua yang Anda butuhkan - pada dasarnya semuanya bermuara pada perkalian matriks vektor.
Sebelum munculnya vertex shaders, opsi yang memungkinkan untuk mengubah simpul pada kartu grafis sangat terbatas. Yang tersedia adalah objek yang bergerak dan berputar, serta beberapa operasi lain, tetapi tidak ada yang terlalu berlebihan atau rumit.
Vertex shaders adalah program komputer kecil yang dijalankan pada kartu grafis. Mereka mengambil satu simpul, melakukan
tindakan yang diperlukan dengan itu dan mengeluarkan simpul keluaran. Mereka tidak hanya bisa memindahkannya, tetapi juga membuat mereka melompat-lompat, menjauh dari puncak terdekat, mengayun tergantung pada angin, menjadi animasi dan banyak lagi.
Saya mengambil salah satu shader vertex yang digunakan pada Watch Dogs dan bereksperimen dengannya sedikit untuk menunjukkan apa yang dilakukannya. Ini adalah pekerjaan yang sangat melelahkan, tetapi saya berhasil menemukan vertex shader yang digunakan untuk karakter dan mengubahnya. Ada vertex shader lain yang digunakan untuk kulit, misalnya, untuk wajah dan tangan, tetapi Anda akan segera memahami prinsipnya.
Saya membuat perubahan yang sangat sederhana yang menambahkan tikungan pada model karakter, tetapi semua yang lain digunakan seperti biasa.Animasi di atas menunjukkan bahwa karakternya entah bagaimana anehnya terdistorsi. Ini membawa kita kembali ke prinsip "jika Anda memindahkan setiap titik, maka ini mirip dengan memindahkan seluruh objek." Perubahan yang dilakukan pada vertex shader hanya berfungsi untuk satu vertex pada satu waktu, tetapi karena mereka semua bekerja dengan distorsi yang sama, efeknya diterapkan ke seluruh objek.
Anda juga dapat membuat perubahan pada bagian transformasi, yang bertanggung jawab untuk "hanya pindah ke tempat," sehingga alih-alih menempatkan karakter di tempat yang tepat, dia mengangkatnya di atas tanah. Ini tidak disimulasikan dengan bantuan fisika, oleh karena itu tidak ada hubungannya dengan gravitasi atau tabrakan dengan benda lain - jika kita mau, kita dapat membuat semua orang melayang di udara.
Dalam animasi ini, kami membuat vertex shader secara bertahap menaikkan dan menurunkan objek.Jelas, semua ini tidak terlalu konstruktif, tetapi memberi kita gambaran umum tentang cara kerja vertex shaders - jika kita sekarang ingin menghidupkan daun di pohon sehingga mereka berayun, kita akan melakukan hal yang sama. Hanya alih-alih menaikkan dan menurunkan, mereka akan berayun ke arah angin. Kemudian kita dapat mengubah kekuatan angin sehingga pohon-pohon bergoyang lebih atau kurang.
Di sini kita melihat apa yang terjadi ketika semuanya meningkat sekitar tujuh kali.Saya menyederhanakan sedikit, tetapi pada dasarnya tugas sebagian besar shader vertex adalah "memindahkan objek ke tempatnya". Pengecualiannya adalah semua objek animasi - orang, hewan, serta objek seperti tali berayun, pakaian berkibar, dll.
Orang animasi terhubung dengan gagasan menggunakan kerangka dan "kulit". Kerangka adalah deskripsi sederhana dari karakter yang bergerak. Pada tahap ini, kita tidak peduli dengan gesper, topi, atau celana jeans yang tidak dianimasikan - hanya gerakan penting yang paling tepat untuk kerangka manusia yang penting bagi kita.
Kerangka sederhana dari sosok manusia ditampilkan di sini. Itu tidak diambil dari Watch Dogs, karena kerangka itu sulit untuk divisualisasikan di luar editor 3D.Gambar dilisensikan oleh Attribution-ShareAlike CC BY-SA © Tim MakeHuman 2001-2014Ini adalah pose jepret atau pose-T yang menunjukkan bagaimana karakter terlihat tanpa menggunakan animasi.Animasi - berlari, berjalan, melompat - hanya berlaku untuk kerangka ini. Ini membuat keseluruhan proses menjadi sangat sederhana, karena kita hanya perlu mempertimbangkan sekitar seratus tulang, bukan ribuan dan ribuan simpul.
Setelah membuat kerangka, setiap dhuwur menempel pada satu atau lebih tulang dalam pose statis ini, dan hubungan ini disebut "menguliti". Pada saat Half-Life 1, ketika teknologi ini mulai digunakan, masing-masing simpul terkait dengan hanya satu tulang. Saat ini, mereka bahkan dapat bergabung dengan empat tulang, sementara masing-masing tulang diberi berat, di mana tingkat pengaruh tulang pada puncak tergantung. Berkat ini, Anda bisa mendapatkan animasi yang lebih halus, memungkinkan tulang untuk bersinggungan di area yang berbeda tanpa membuat sudut tajam saat menggerakkan lengan atau kaki.
Ini adalah kerangka yang ditunjukkan di atas dengan tulang paha diputar. Warna-warna menunjukkan berat tulang pinggul relatif terhadap bagian atas model.Gambar dilisensikan oleh Attribution-ShareAlike CC BY-SA © Tim MakeHuman 2001-2014Teknologi ini memiliki keterbatasan, terutama di tempat-tempat pakaian dan kulit dikompresi atau diregangkan dalam engsel, misalnya pada siku dan bahu. Ini adalah cara yang tidak sempurna, tetapi sangat efektif untuk menghidupkan. Keterbatasan paling serius adalah sangat sulit membuat animasi wajah yang memikat dengan cara ini. Anda dapat membuat banyak tulang "palsu" di wajah Anda, misalnya untuk alis dan di sekitar mulut, tetapi ini hanya perkiraan kasar dari otot dan kulit.
Fitur penting lain dari teknik ini adalah perbandingan verteks dan tulang sangat spesifik dan terkait dengan bagaimana perbandingan ini dilakukan. Dimungkinkan untuk menggunakan animasi untuk beberapa model yang berbeda, tetapi setiap model individu di mana Anda ingin menggunakan kerangka harus dikaitkan dengan tulang. Alasannya adalah bahwa animasi memindahkan simpul dari posisi semula relatif ke kerangka mereka. Jika simpul tidak pada posisi yang diharapkan, maka masalah akan muncul.
Jika model tidak cocok dengan kerangka yang digunakan olehnya, maka animasinya akan sepenuhnya salah.Jika kita membuat karakter dua kali lebih lebar, kita mendapatkan efek yang mirip dengan "donat makan berlebihan" Drake , tetapi terlihat bahwa animasi yang lebih dekat dengan kuas menjadi salah, karena ini adalah tempat mereka paling jauh dari posisi aslinya.Animasi pertama mungkin tampak aneh bagi Anda - animasi kesalahan seperti ini sering terjadi di permainan. Biasanya mereka disebabkan oleh fakta bahwa animasi yang salah diterapkan pada kerangka, atau model menggunakan kerangka yang salah. Seperti dalam kasus dengan tekstur dan model, kerangka, menguliti dan model harus sangat hati-hati dibandingkan, jika tidak hasilnya akan cepat menjadi sedih.
Saya harap Anda mendapat ide tentang tujuan vertex shader dan memahami bagaimana animasi digunakan untuk mengubah model statis menjadi karakter yang hidup.