Bagaimana rendering perangkat lunak dilakukan?


15

Saya ingin menjelajahi rasterisasi berbasis perangkat lunak realtime. Saya tahu semuanya berjalan menuju GPU hari ini tetapi ada beberapa permainan di mana masih masuk akal untuk menggunakan perender perangkat lunak.

Misalnya: Voxeltron

Voxatron adalah penembak arena yang terjadi di dunia yang terbuat dari voxels (batu kecil, semacam). Segala sesuatu dalam gim ini ditampilkan dalam tampilan voxel 128x128x64 virtual, termasuk menu dan inventaris pemain. Jika Anda melihat lebih dekat, Anda kadang-kadang dapat melihat inventaris (skor / kehidupan / amunisi) melemparkan bayangan pada beberapa objek di tanah.

Saya telah bekerja pada rendering voxel dan alat pemodelan untuk waktu yang lama sekarang, dengan tujuan akhir membuat game petualangan eksplorasi yang besar. Sekitar setengah tahun yang lalu itu menyatu dengan pekerjaan yang saya lakukan pada penembak arena untuk Conflux, dan inilah hasilnya.

Ini adalah permainan yang sangat sederhana di hati - sebagian besar hanya Robotron diatur dalam dunia dirusak 3d dengan makhluk konyol. Saya tidak yakin seberapa besar implikasi dari destructibility akan untuk gameplay, tapi itu pasti menyenangkan untuk menghancurkan potongan-potongan dinding. Saya juga menambahkan pickup bangunan-eksperimental yang dapat Anda gunakan untuk membangun penghalang untuk bersembunyi dari monster yang menakutkan.

Permainan berlangsung di satu set kecil arena. Beberapa dari mereka menawarkan kamar-kamar dengan aksi aksi, di suatu tempat antara Knightlore dan Smash TV. Ini adalah beberapa desain berbasis petualangan asli yang menyelinap masuk, dan alasan untuk menciptakan lingkungan tematik.

Fitur:

  • Render perangkat lunak khusus dengan bayangan lembut.
  • Built-in synthesizer suara dan musik (juga digunakan untuk membuat musik trailer).
  • Putar & pasca rekaman permainan.

1
Tautan rapi ke permainan. Perhatikan bahwa tidak perlu menggunakan perender perangkat lunak untuk mendapatkan bayangan lembut pada GPU . Dia akan mengalami beberapa batasan kinerja dari sisi render loop, tidak dapat berjalan pada mesin yang lebih mendasar seperti laptop 1,6 GHz atau perangkat genggam, ketika dia benar-benar bisa jika dia mengeksploitasi perangkat keras yang tersedia.
bobobobo

Jawaban:


11

Saya akan menganggap Anda sudah tahu beberapa aljabar linier dasar, jenis yang terlibat dalam: proyeksi 3d, pengaturan kamera, mengubah simpul menjadi posisi dunia, dll ... Jika tidak, ada banyak tempat bagus untuk belajar. Inilah dua yang saya sukai:

Arsitektur Mesin Game

  • Cakupan singkat dari aljabar linier dasar tetapi tidak mencakup semua yang perlu Anda ketahui. Buku ini juga berharga untuk banyak alasan lain.

Rendering waktu-nyata

  • Cakupan yang sedikit lebih rinci tetapi sekali lagi hanya menempel pada apa yang mungkin perlu Anda ketahui. Sekali lagi, saya merekomendasikan yang ini untuk topik-topik yang dibahas dalam bab-bab selanjutnya.

Setelah Anda tahu cara merepresentasikan dan menangani objek 3d, Anda siap melihat cara menggambarnya di layar. Biasanya ini dilakukan dengan teknik rasterisasi segitiga garis pindai. Ini sebenarnya konsep yang cukup sederhana. Anda menggambar satu baris dari satu segitiga pada satu waktu sambil menginterpolasi koordinat warna dan tekstur uv. Proses ini dilanjutkan untuk semua segitiga di layar. Anda bahkan bisa menerapkan buffer kedalaman untuk menangani rendering pesanan.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Ini dibahas lebih rinci dalam artikel ini:

Tutorial - Pengantar Rendering Berbasis Perangkat Lunak: Rasterisasi Segitiga

Sekolah Rendering Perangkat Lunak: Bagian I


Dan hanya untuk bersenang-senang, lihat artikel berikut:

Tinjauan Kode Sumber Gempa 2 3/4 (Perender Perangkat Lunak)


Sama-sama:] (Anda mungkin juga ingin melihat di sini untuk ikhtisar proses yang lebih terperinci: en.wikipedia.org/wiki/Rasterisation )
zfedoran

Beberapa tautan bagus di sana!
Jonathan Connell

5

Ini adalah topik yang cukup luas. Ada dua bagian dasar untuk itu: teori aktual dari transformasi grafik dan pipa rasterisasi, dan bit implementasi aktual yang memungkinkan Anda meledakkan piksel pada layar ke layar sesuai keinginan Anda. Selain itu, ada juga optimasi (terutama dari bit terakhir).

Bagian pertama untungnya sama dengan teori yang digunakan untuk pipa grafik seperti yang diungkapkan oleh perangkat keras dan API modern. Jika Anda sudah tahu ini, Anda siap. Jika tidak, saya merekomendasikan buku yang bagus. Yang ini ini cukup bagus.

Ada banyak opsi untuk bagian kedua. Mereka sangat bergantung pada pilihan OS dan toolchain Anda. Jika Anda menggunakan C atau C ++, di Windows, Anda bisa langsung memplot piksel langsung ke bitmap GDI ( SetPixelsederhana, namun menyakitkan, tidak berguna lambat - CreateDIBSectionmemberi Anda sejumlah byte mentah yang dapat Anda manipulasi dengan kecepatan yang jauh lebih cepat).

Anda juga dapat memperoleh permukaan DirectDraw dan menulisnya, atau menulis ke tekstur Direct3D atau OpenGL. Dalam kasus-kasus terakhir ini Anda masih akan menggunakan perangkat keras, tetapi selama Anda melakukan sendiri semua komposisi gambar akhir pada CPU dan hanya menggunakan API perangkat keras untuk menyalin hasilnya ke layar, itu masih diperhitungkan. Pada PC modern Anda tidak bisa mendapatkan akses ke VRAM mentah atau apa pun secara langsung.

Jika Anda ingin tahu lebih banyak, Anda mungkin harus membuat pertanyaan yang lebih spesifik. Saya atau orang lain akan dengan senang hati menjawabnya.


Untuk buku: Seberapa bagus "cukup bagus"? $ 84 sedikit uang tunai :)
Jonathan Connell

Ini yang paling saya rekomendasikan. Untuk opsi termurah, Anda bisa merujuk ke dokumentasi Direct3D pada pipa transformasi. Meskipun spesifik D3D, 95% dari itu cukup berlaku untuk teori umum. Anda juga dapat melihat salinan online Buku Merah OpenGL. Mereka sudah ketinggalan zaman, tetapi teori (sekali lagi) masih berlaku.

0

Oke saya akan mendekati pertanyaan ini dari dasar-dasarnya; apa pun di luar itu adalah cara untuk meluaskan QA sederhana; Anda perlu membeli buku tentang masalah ini.

Perbedaan paling mendasar antara rendering dalam perangkat lunak dan menggunakan GPU adalah pada merencanakan piksel. Artinya, ketika melakukan perenderan perangkat lunak Anda pada akhirnya bertanggung jawab untuk memplot setiap piksel, sedangkan dengan GPU, plotting piksel sebagian besar diotomatiskan oleh perangkat keras dan Anda hanya "memijat" pipa pixel menggunakan shader.

Sebagai contoh, pikirkan tentang apa yang Anda sebagai programmer harus lakukan untuk menampilkan segitiga 3D di layar. Dengan GPU, Anda cukup memberi tahu perangkat keras apa koordinat X, Y, Z dari simpul dan kemudian kartu video mengisi semua piksel pada layar yang terdiri dari gambar segitiga. Anda mungkin menggunakan shader untuk memberi tahu GPU untuk mengubah warna setiap piksel berdasarkan pada tekstur atau sesuatu, tetapi pada akhirnya itu tetap ke GPU yang secara otomatis mengisi semua piksel untuk Anda.

Melakukan rendering perangkat lunak, Anda harus menghitung piksel mana pada layar untuk diisi, dan kemudian melakukan blitting untuk benar-benar mengisi piksel tersebut. Artinya, Anda akan melakukan matrik matematika untuk mengubah dari ruang koordinat adegan 3D ke ruang tampilan, lalu memproyeksikan poin dari ruang tampilan ke layar, dll.

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.