Dalam posting ini kita akan mempertimbangkan tahap kerja dengan simpul. Artinya, kita harus kembali mendapatkan buku teks matematika dan mengingat aljabar linier, matriks, dan trigonometri. Hore!
Kami akan mencari tahu bagaimana model 3D ditransformasikan dan sumber cahaya diperhitungkan. Kami juga akan menjelaskan secara detail perbedaan antara vertex dan geometri shaders, dan Anda akan mengetahui pada tahap apa tempat tessellation. Untuk memfasilitasi pemahaman, kami menggunakan diagram dan contoh kode yang menunjukkan bagaimana permainan melakukan perhitungan dan memproses nilai.
Tangkapan layar di awal posting menunjukkan GTA V game dalam mode tampilan gambar rangka. Bandingkan dengan gambar rangka setengah Life yang jauh lebih kompleks. Gambar dibuat oleh thalixte dengan
ReShade .
Apa gunanya
Dalam dunia matematika, sebuah titik hanyalah sebuah tempat dalam ruang geometris. Tidak ada yang lebih kecil dari titik, itu tidak memiliki ukuran, sehingga titik dapat digunakan untuk menentukan lokasi yang tepat dari awal dan akhir objek seperti segmen garis, bidang dan volume.
Untuk grafik 3D, informasi tersebut sangat penting, penampilan semuanya tergantung padanya, karena semua objek ditampilkan sebagai set segmen garis, bidang, dll. Gambar di bawah ini menunjukkan tangkapan layar dari Bethesda 2015
Fallout 4 :
Mungkin tidak mudah bagi Anda untuk melihat bahwa ini hanyalah sekelompok besar titik dan garis, jadi kami akan menunjukkan kepada Anda bagaimana pemandangan yang sama terlihat dalam mode wireframe. Dalam mode ini, mesin rendering 3D melewatkan tekstur dan efek yang dilakukan pada tahap piksel dan hanya menggambar garis multi-warna yang menghubungkan titik-titik.
Sekarang semuanya terlihat sangat berbeda, tetapi kita melihat bagaimana semua garis digabungkan untuk membentuk berbagai objek, lingkungan, dan latar belakang. Beberapa hanya terdiri dari puluhan garis, misalnya, batu di latar depan, sementara yang lain mengandung begitu banyak garis sehingga terlihat kokoh.
Setiap titik di awal dan akhir setiap baris diproses dengan melakukan sejumlah kalkulasi. Beberapa perhitungan sangat sederhana dan cepat, yang lain jauh lebih rumit. Dengan memproses poin dalam kelompok, terutama dalam bentuk segitiga, Anda dapat mencapai peningkatan produktivitas yang signifikan, jadi mari kita lihat lebih dekat.
Apa yang dibutuhkan untuk sebuah segitiga?
Segitiga nama memperjelas bahwa sosok tersebut memiliki tiga sudut internal; Untuk melakukan ini, ia membutuhkan tiga titik sudut dan tiga segmen yang menghubungkannya. Memang benar untuk memanggil titik sudut
vertex (vertex) (dalam bentuk jamak - verteks); setiap titik didefinisikan oleh suatu titik. Karena kita berada di dunia geometris tiga dimensi,
sistem koordinat Cartesian digunakan untuk poin. Biasanya koordinat ditulis dalam bentuk tiga nilai, misalnya, (1, 8, -3), atau secara umum (
x, y, z ).
Selanjutnya, kita bisa menambahkan dua simpul lagi untuk membentuk segitiga:
Perhatikan bahwa garis yang ditampilkan adalah opsional - kita dapat mengatur titik dan memberi tahu sistem bahwa ketiga simpul ini membentuk segitiga. Semua data vertex disimpan dalam blok memori yang berdekatan yang disebut
vertex buffer ; informasi tentang gambar yang mereka bentuk dikodekan secara langsung dalam program rendering, atau disimpan dalam blok memori lain yang disebut
buffer indeks .
Jika informasi dikodekan dalam program rendering, maka berbagai bentuk yang dapat dibentuk oleh simpul disebut
primitif . Direct3D menyarankan menggunakan daftar untuk mereka, strip dan kipas dalam bentuk titik, garis, dan segitiga. Ketika digunakan dengan benar, garis-garis segitiga menggunakan simpul untuk lebih dari satu segitiga, yang meningkatkan produktivitas. Dalam contoh di bawah ini, kita melihat bahwa untuk membuat dua segitiga terhubung bersama, hanya empat simpul yang diperlukan - jika mereka dipisahkan, maka kita perlu enam simpul.
Dari kiri ke kanan: daftar titik, daftar garis dan strip segitigaJika kita perlu memproses set simpul yang lebih besar, misalnya, dalam model NPC game, maka lebih baik menggunakan objek yang disebut
mesh , blok memori lain, tetapi terdiri dari beberapa buffer (simpul, indeks, dll.) Dan memodelkan sumber daya tekstur .
Dokumentasi online Microsoft memiliki penjelasan singkat tentang cara menggunakan buffer ini.
Untuk saat ini, mari kita fokus pada apa yang terjadi pada simpul-simpul ini dalam game 3D saat merender setiap frame baru. Singkatnya, mereka melakukan salah satu dari dua operasi:
- Vertex bergerak ke posisi baru.
- Perubahan warna vertex
Siap untuk matematika? Luar biasa, karena kita membutuhkannya.
Vektor muncul di atas panggung.
Bayangkan Anda memiliki segitiga di layar dan Anda menekan tombol untuk memindahkannya ke kiri. Secara alami, kami mengharapkan angka (
x, y, z ) dari setiap titik akan berubah sesuai; itulah yang terjadi, tetapi cara yang agak tak terduga
untuk menerapkan perubahan. Alih-alih hanya mengubah koordinat, sebagian besar sistem rendering grafik 3D menggunakan alat matematika khusus: maksud kami
vektor .
Vektor dapat direpresentasikan sebagai panah yang menunjuk ke titik tertentu dalam ruang dan memiliki panjang yang diinginkan. Verteks biasanya diset menggunakan vektor berdasarkan koordinat Cartesius:
Perhatikan bahwa panah biru dimulai di satu tempat (dalam hal ini,
titik asal ) dan meluas ke atas. Untuk mengatur vektor, kami menggunakan
catatan dalam kolom , tetapi sangat mungkin untuk menggunakan
catatan dalam satu baris . Anda mungkin telah memperhatikan bahwa ada nilai lain, keempat, yang biasa disebut
komponen-w . Ini digunakan untuk menunjukkan apa kepanjangan dari vektor: posisi titik (
vektor posisi ) atau arah umum (vektor
arah ). Dalam kasus vektor arah, akan terlihat seperti ini:
Vektor ini menunjuk ke arah yang sama dan memiliki panjang yang sama dengan vektor posisi sebelumnya, yaitu nilainya (
x, y, z ) akan sama; Namun, komponen
w bukan 1, tetapi nol. Kami akan menjelaskan penggunaan vektor arah nanti, tetapi untuk sekarang, ingat fakta bahwa semua simpul dalam adegan 3D akan dijelaskan dengan cara ini. Mengapa Karena dalam format ini lebih mudah untuk memindahkannya.
Matematika, matematika, dan matematika lagi
Ingatlah bahwa kita memiliki segitiga sederhana dan kami ingin memindahkannya ke kiri. Setiap simpul dijelaskan oleh vektor posisi, oleh karena itu, "matematika gerakan" (disebut
transformasi ) harus bekerja dengan vektor-vektor ini. Alat baru muncul:
matriks (
matriks dalam bentuk tunggal). Ini adalah array nilai yang ditulis dalam format yang mirip dengan spreadsheet Excel, dengan baris dan kolom.
Untuk setiap jenis transformasi ada matriks yang sesuai, dan untuk transformasi itu cukup dengan melipatgandakan matriks transformasi dan vektor posisi. Kami tidak akan membahas secara terperinci bagaimana dan mengapa hal ini terjadi, tetapi hanya melihat bagaimana tampilannya.
Memindahkan simpul dalam ruang 3D disebut
terjemahan, dan membutuhkan perhitungan berikut:
Nilai
x 0 , dll. mewakili koordinat asli vektor;
nilai delta -
x mewakili jumlah titik yang perlu dipindahkan. Penggandaan matriks dan vektor mengarah pada fakta bahwa mereka hanya meringkas (perhatikan bahwa komponen-
w tetap tidak berubah sehingga jawaban yang sudah selesai tetap vektor posisi seperti sebelumnya).
Selain bergerak, kita mungkin juga perlu memutar segitiga atau mengubah skalanya - untuk operasi ini, ada juga transformasi.
Transformasi ini memutar titik di sekitar sumbu z pada bidang XYDan ini digunakan jika Anda perlu mengubah skala gambarKita dapat menggunakan alat grafis berbasis WebGL dari
Real-Time Rendering untuk memvisualisasikan perhitungan ini untuk keseluruhan gambar. Mari kita mulai dengan kotak di posisi standar:
Dalam alat online ini, titik model adalah vektor posisi, matriks dunia adalah matriks transformasi, dan titik ruang-dunia adalah vektor posisi untuk transformasi verteks.
Mari kita terapkan berbagai transformasi pada kotak:
Pada gambar di atas, gambar
dipindahkan 5 unit di sepanjang setiap sumbu. Nilai-nilai ini dapat dilihat di kolom terakhir dari matriks besar menengah. Vektor posisi asli (4, 5, 3, 1) tetap sama seperti seharusnya, tetapi vertex yang ditransformasikan sekarang dipindahkan ke (9, 10, 8, 1).
Dalam transformasi ini, semuanya diskalakan dengan faktor 2: sekarang sisi kotak menjadi dua kali lebih panjang. Akhirnya, lihat contoh rotasi:
Paralipipip diputar melalui sudut 45 °, tetapi
sinus dan
kosinus sudut ini digunakan dalam matriks. Setelah memeriksa kalkulator ilmiah, kita dapat melihat bahwa
dosa (45 °) = 0,7071 ..., yang dibulatkan ke nilai yang ditunjukkan 0,71. Kami mendapatkan jawaban yang sama untuk nilai
cosinus .
Matriks dan vektor adalah opsional; Alternatif yang populer bagi mereka, terutama ketika menangani belokan kompleks, adalah penggunaan bilangan kompleks dan
angka empat . Perhitungan ini sangat berbeda dari vektor, jadi kami tidak akan mempertimbangkannya, terus bekerja dengan transformasi.
Vertex Shader Power
Pada tahap ini, kita perlu memahami bahwa semua ini dilakukan oleh orang yang memprogram kode rendering. Jika pengembang game menggunakan mesin pihak ketiga (misalnya, Unity atau Unreal), maka semua ini telah dilakukan untuknya; tetapi jika seseorang membuat mesinnya dari awal, maka dia harus melakukan semua perhitungan ini dengan simpul.
Tetapi bagaimana semua ini terlihat dari segi kode?
Untuk memahami ini, kami akan menggunakan contoh dari situs web
Braynzar Soft yang menakjubkan. Jika Anda ingin mulai bekerja dengan pemrograman 3D sendiri, maka ini adalah tempat yang tepat untuk mempelajari dasar-dasarnya, serta hal-hal yang lebih kompleks ...
Ini adalah contoh dari transformasi all-in-one. Ini menciptakan matriks transformasi yang sesuai berdasarkan input keyboard, dan kemudian menerapkannya ke vektor posisi asli dalam satu operasi. Perhatikan bahwa ini selalu dilakukan dalam urutan yang diberikan (penskalaan - rotasi - transfer), karena cara lain akan benar-benar merusak hasilnya.
Blok kode semacam itu disebut
vertex shaders , kompleksitas dan ukurannya dapat sangat bervariasi. Contoh di atas sederhana,
hanya vertex shader yang tidak menggunakan sifat penuh shader yang dapat diprogram. Urutan shader yang lebih kompleks dapat mengubah objek dalam ruang 3D, memproses penampilan mereka dari sudut pandang kamera pemandangan, dan kemudian mentransfer data ke tahap selanjutnya dari proses rendering. Mempertimbangkan urutan pemrosesan vertex, kita akan mempelajari contoh-contoh lain.
Tentu saja, mereka dapat digunakan lebih banyak lagi, jadi ketika memainkan game 3D, jangan lupa bahwa semua gerakan yang Anda lihat dibuat oleh GPU yang menjalankan perintah vertex shader.
Namun, ini tidak selalu terjadi. Jika Anda kembali ke pertengahan akhir 1990-an, maka kartu grafis pada zaman itu tidak memiliki kemampuan untuk secara mandiri memproses simpul dan primitif, hanya prosesor pusat yang melakukan semua ini.
Salah satu prosesor pertama dengan akselerasi perangkat keras mereka sendiri dari proses ini adalah
Nvidia GeForce, dirilis pada tahun 2000 , dan fungsi ini disebut
Hardware Transform and Lighting (singkatnya, Hardware TnL). Proses yang dapat ditangani oleh peralatan ini sangat terbatas dalam hal tim, tetapi dengan merilis chip baru, situasinya berubah dengan cepat. Saat ini, tidak ada peralatan terpisah untuk memproses simpul, dan satu perangkat melakukan semuanya sekaligus: titik, primitif, piksel, tekstur, dll.
Ngomong-ngomong, tentang
pencahayaan : perlu dicatat bahwa kita melihat semuanya berkat cahaya, jadi mari kita lihat bagaimana hal itu dapat diproses pada tahap puncak. Untuk melakukan ini, kita perlu mengambil keuntungan dari apa yang kita bicarakan sebelumnya.
Cahaya, kamera, motor!
Bayangkan gambar ini: pemain berdiri di ruangan gelap, diterangi oleh satu sumber cahaya di sebelah kanan. Di tengah ruangan ada ketel besar. Anda mungkin perlu bantuan untuk hal ini, jadi mari gunakan situs web
Real-Time Rendering dan lihat tampilannya:
Jangan lupa bahwa objek ini adalah seperangkat segitiga datar yang saling terhubung; artinya, bidang setiap segitiga akan diarahkan ke arah tertentu. Beberapa dari mereka diarahkan ke kamera, beberapa - yang lain, beberapa akan terdistorsi. Cahaya dari sumber jatuh pada setiap bidang dan dipantulkan dari sana pada sudut tertentu.
Tergantung di mana cahaya dipantulkan, warna dan kecerahan pesawat dapat berubah, dan agar warna objek terlihat benar, semua ini perlu dihitung dan diperhitungkan.
Untuk memulainya, kita perlu mencari tahu di mana setiap pesawat diarahkan, dan untuk ini kita perlu
vektor normal pesawat. Ini adalah panah lain, tetapi tidak seperti vektor posisi, ukurannya tidak penting (pada kenyataannya, setelah menghitung skala vektor normal selalu berkurang sehingga mereka memiliki panjang 1), dan selalu diarahkan
tegak lurus (pada sudut kanan) ke pesawat.
Normal ke bidang setiap segitiga dihitung dengan menentukan produk vektor dari vektor dua arah (ditunjukkan di atas
p dan
q ) yang membentuk sisi-sisi segitiga. Sebenarnya, lebih baik untuk menghitung mereka untuk setiap titik, dan bukan untuk segitiga, tetapi karena selalu ada lebih banyak dari yang pertama daripada yang terakhir, akan lebih cepat untuk menghitung normal untuk segitiga.
Setelah menerima yang normal ke permukaan, Anda dapat mulai mempertimbangkan sumber cahaya dan kamera. Dalam rendering 3D, sumber cahaya bisa dari berbagai jenis, tetapi dalam artikel ini kami hanya akan mempertimbangkan sumber
arah , misalnya, lampu sorot. Seperti bidang segitiga, sorotan dan kamera akan menunjuk ke arah tertentu, sesuatu seperti ini:
Vektor sumber cahaya dan vektor normal dapat digunakan untuk menghitung sudut di mana cahaya jatuh di permukaan (menggunakan hubungan antara produk skalar vektor dan produk ukurannya). Verteks segitiga akan berisi informasi tambahan tentang warna dan bahannya. Materi menggambarkan apa yang terjadi pada cahaya ketika menyentuh permukaan.
Permukaan logam yang halus akan memantulkan hampir semua cahaya yang terjadi pada sudut jatuh, dan nyaris tidak mengubah warna objek. Bahan matte kasar menyebarkan cahaya dengan cara yang tidak dapat diprediksi dan sedikit berubah warna. Untuk memperhitungkan ini, Anda perlu menambahkan nilai tambahan ke simpul:
- Warna dasar asli
- Ambient Material Attribute - nilai yang menentukan seberapa banyak pencahayaan "latar belakang" dapat menyerap dan memantulkan suatu titik
- Atribut bahan Diffuse adalah nilai lain, tetapi kali ini menentukan "kekasaran" dari titik, yang, pada gilirannya, mempengaruhi jumlah penyerapan dan refleksi dari cahaya yang tersebar.
- Atribut Bahan Specular - Dua Nilai yang Menentukan Gloss Vertex
Model pencahayaan yang berbeda menggunakan rumus matematika yang berbeda untuk mengelompokkan semua atribut ini, dan hasil perhitungannya adalah vektor pencahayaan keluar. Dalam kombinasi dengan vektor kamera, ini memungkinkan Anda untuk menentukan keseluruhan tampilan segitiga.
Satu sumber cahaya terarah menerangi banyak demo Nvidia yang berbedaKami menghilangkan banyak detail, dan untuk alasan yang baik: buka tutorial rendering 3D apa pun, dan Anda akan melihat bahwa seluruh bab dikhususkan untuk proses ini. Namun, dalam gim modern, sebagian besar dari semua perhitungan pencahayaan dan efek material dilakukan pada tahap pemrosesan piksel, jadi kami akan kembali ke mereka di artikel berikutnya.
Kode sampel B. Anguelov menunjukkan bagaimana model refleksi cahaya Phong dapat diproses dalam vertex shader.Semua yang kami periksa di atas dilakukan oleh vertex shaders, dan tampaknya tidak ada yang mustahil bagi mereka; sayangnya tidak demikian. Vertex shaders tidak dapat membuat simpul baru, dan setiap shader harus memproses setiap vertex individu. Akan lebih mudah jika Anda bisa menggunakan kode untuk membuat segitiga baru di antara yang sudah kita miliki (untuk meningkatkan kualitas visual), dan memiliki shader yang memproses keseluruhan primitif (untuk mempercepat pemrosesan). Nah, dalam GPU modern kita
bisa melakukannya!
Tolong pak, saya ingin lebih (segitiga)
Chip grafis modern sangat kuat dan mampu melakukan jutaan perhitungan matriks-vektor setiap detik; mereka dengan mudah mengatasi tumpukan besar puncak sekaligus. Di sisi lain, membuat model yang sangat rinci untuk rendering adalah proses yang sangat panjang, dan jika model agak jauh dari tempat kejadian, maka semua detail ini akan sia-sia.
Artinya, kita perlu entah bagaimana memerintahkan prosesor untuk membagi primitif besar, misalnya, satu segitiga datar menjadi satu set segitiga lebih kecil yang terletak di dalam yang asli. Proses semacam itu disebut
tesselation, dan chip grafis telah belajar untuk melakukannya dengan sangat baik; selama bertahun-tahun pembangunan, tingkat kontrol yang dimiliki programmer atas proses ini telah meningkat.
Untuk melihat ini dalam tindakan, kita akan menggunakan
alat benchmark Heaven dari mesin Unigine , karena itu memungkinkan kita untuk menerapkan nilai tessellation yang berbeda untuk model yang digunakan dalam pengujian.
Untuk memulai, mari kita mengambil tempat di benchmark dan mempelajarinya tanpa menggunakan tessellation. Perhatikan bahwa batu bulat di tanah terlihat sangat tidak wajar - tekstur yang digunakan efektif, tetapi tampaknya salah. Mari kita terapkan tessellation ke TKP: mesin Unigine hanya menerapkannya pada masing-masing bagian, tetapi perbedaannya akan signifikan.Tanah, tepi bangunan dan pintu terlihat jauh lebih realistis. Kita bisa melihat bagaimana ini dicapai dengan memulai proses lagi, tapi kali ini dengan pemilihan semua primitif (yaitu, dalam mode rangka gambar):Terlihat jelas mengapa bumi terlihat sangat aneh - benar-benar datar! Pintunya menyatu dengan dinding, dan ujung-ujung bangunannya sejajar sederhana.Dalam Direct3D, primitif dapat dibagi menjadi sekelompok bagian yang lebih kecil (proses ini disebut sub-divisi) dengan melakukan proses tiga langkah. Pertama, programmer menulis surface shader (hull shader) - pada kenyataannya, kode ini menciptakan struktur yang disebut patch geometri . Anda dapat menganggapnya sebagai peta yang memberi tahu prosesor tempat titik dan garis baru akan muncul di dalam primitif awal.Kemudian, blok tessellator di dalam GPU menerapkan tambalan ini ke primitif. Pada akhirnya, shader domain dijalankanmenghitung posisi semua simpul baru. Jika perlu, data ini dapat ditransfer kembali ke vertex buffer sehingga perhitungan pencahayaan dapat dilakukan lagi, tetapi kali ini dengan hasil yang lebih baik.Seperti apa bentuknya? Mari kita luncurkan versi gambar rangka dari adegan tessellated:Jujur, kami menetapkan tingkat tessellation yang agak tinggi untuk membuat penjelasan proses lebih terlihat. Tidak peduli seberapa bagus chip grafis modern, ini tidak boleh dilakukan di setiap adegan - lihat, misalnya, pada lampu di sebelah pintu.Dalam gambar dengan bingkai gambar dinonaktifkan, Anda tidak akan menemukan perbedaan pada jarak ini, dan kami melihat bahwa tingkat tessellation seperti menambahkan begitu banyak segitiga sehingga sulit untuk memisahkan mereka dari satu sama lain. Namun, ketika digunakan dengan benar, fungsi pemrosesan dhuwur ini dapat menciptakan efek visual yang fantastis, terutama ketika mensimulasikan tabrakan benda lunak.Mari kita lihat bagaimana tampilannya dalam hal kode Direct3D; untuk ini kami menggunakan contoh dari situs web hebat lainnya, RasterTek .Berikut adalah segitiga hijau sederhana yang di-tessellated menjadi banyak segitiga kecil ...Pemrosesan vertex dilakukan oleh tiga shader terpisah (lihat contoh kode ): shader vertex yang menyiapkan segitiga untuk tessellation, shader permukaan yang menghasilkan tambalan, dan shader domain yang memproses simpul baru. Hasilnya cukup jelas, tetapi contoh Unigine menunjukkan manfaat potensial dan bahaya penghentian penggunaan di mana-mana."Besi" tidak tahan!
Ingat, kami mengatakan bahwa vertex shader selalu memproses setiap titik tunggal dalam sebuah adegan? Mudah dipahami bahwa penghentian bisa menjadi masalah serius di sini. Dan ada banyak efek visual di mana Anda perlu memproses versi yang berbeda dari satu primitif, tetapi tanpa membuatnya dari awal, misalnya, rambut, bulu, rumput, dan partikel ledakan.Untungnya, terutama untuk hal-hal seperti itu, ada shader lain - shader geometris . Ini adalah versi vertex shader yang lebih terbatas, tetapi dapat diterapkan ke seluruh primitif. Dalam kombinasi dengan tessellation, itu memberi programmer peningkatan kontrol atas kelompok besar simpul.3DMark Vantage UL Benchmark - partikel proses shader geometri dan benderaDirect3D, seperti semua API grafik modern, memungkinkan Anda untuk melakukan banyak perhitungan dengan simpul. Data yang sudah jadi dapat ditransfer ke tahap selanjutnya dari proses rendering ( rasterisasi ), atau dikembalikan ke kumpulan memori untuk diproses ulang atau dibaca oleh prosesor pusat untuk tujuan lain. Seperti yang dijelaskan oleh dokumentasi Microsoft pada Direct3D , ini dapat diimplementasikan sebagai aliran data:Langkah output stream adalah opsional, terutama karena hanya dapat mentransfer seluruh primitif (daripada simpul individu) kembali ke siklus rendering, tetapi berguna untuk efek yang membutuhkan sejumlah besar partikel. Trik yang sama dapat dilakukan dengan menggunakan buffer vertex variabel atau dinamis , tetapi lebih baik untuk menjaga buffer input tidak berubah, karena ketika Anda membukanya untuk diedit, kinerja berkurang.Pemrosesan vertex adalah bagian penting dari rendering, karena menentukan seperti apa pemandangan itu dari perspektif kamera. Dalam gim modern, jutaan segitiga dapat digunakan untuk membangun dunia, dan masing-masing simpul ini entah bagaimana diubah dan diterangi.Segitiga. Ada jutaan dari mereka.Memproses semua perhitungan dan matematika ini mungkin tampak seperti mimpi buruk logistik, tetapi prosesor grafis (GPU) dan API dirancang dengan semua ini dalam pikiran - bayangkan sebuah pabrik yang berfungsi sempurna melewati satu produk pada suatu waktu melalui pipa produksi.Pemrogram rendering game 3D yang berpengalaman memiliki pengetahuan dasar dalam matematika dan fisika; mereka menggunakan semua trik dan alat yang mungkin untuk mengoptimalkan operasi, mengompresi tahap pemrosesan vertex menjadi hanya beberapa milidetik. Tapi ini baru permulaan membangun bingkai 3D - tahap selanjutnya adalah rasterisasi, kemudian pemrosesan piksel dan tekstur yang sangat kompleks, dan baru kemudian gambar tersebut masuk ke monitor.