Apa itu shader dalam game? Bagaimana cara memasang shader di Minecraft? Apa jawaban shader.

Dengan komputerisasi global, sejumlah besar istilah yang tidak dapat dipahami telah datang ke dunia kita. Berurusan dengan mereka semua tidak semudah kelihatannya pada pandangan pertama. Banyak dari mereka memiliki nama yang mirip, banyak yang memiliki fungsi luas. Saatnya untuk mencari tahu apa itu shader, dari mana asalnya, untuk apa dan untuk apa.

Pengoptimal

Kemungkinan besar, Anda adalah pemain Minecraft yang rajin dan itulah sebabnya Anda datang untuk mencari tahu apa itu. Perlu dicatat segera bahwa konsep "shader" mudah dipisahkan dari game ini dan dapat "hidup" secara terpisah darinya. Sama seperti mod. Oleh karena itu, tidak ada gunanya menghubungkan kedua konsep ini dengan erat.

Secara umum, shader berasal dari pemrograman, muncul sebagai asisten spesialis. Mungkin akan sulit untuk menyebut alat ini sebagai pengoptimal, tetapi itu benar-benar meningkatkan gambar dalam game. Jadi, ketika Anda sudah mulai memahami secara kasar apa itu, mari beralih ke interpretasi yang akurat.

Penafsiran

Apa itu shader? yang dijalankan oleh prosesor kartu video. Alat-alat ini dikembangkan dalam bahasa khusus. Tergantung pada tujuannya, itu bisa berbeda. Setelah itu, shader diterjemahkan secara kondisional ke dalam instruksi untuk prosesor akselerator grafis.

Aplikasi

Harus segera dikatakan bahwa aplikasi secara keseluruhan telah ditentukan sebelumnya oleh tujuannya. Program tertanam dalam prosesor kartu video, yang berarti bahwa mereka bekerja pada parameter objek dan gambar grafik tiga dimensi. Mereka dapat melakukan berbagai tugas, termasuk bekerja dengan refleksi, refraksi, peredupan, efek geser, dll.

Premis

Orang-orang telah lama mencoba mencari tahu apa itu shader. Bahkan sebelum program ini, pengembang melakukan semuanya dengan tangan. Proses pembentukan gambar dari beberapa objek tidak otomatis. Sebelum game ini lahir, para pengembang melakukan rendering sendiri. Mereka bekerja dengan algoritme, menyusunnya untuk tugas yang berbeda. Ini adalah bagaimana instruksi untuk menerapkan tekstur, efek video, dll. muncul.

Tentu saja, beberapa proses masih dimasukkan ke dalam pekerjaan kartu video. Algoritma semacam itu dapat digunakan oleh pengembang. Tetapi mereka tidak berhasil memaksakan algoritme mereka pada kartu video. Instruksi non-standar dapat dieksekusi oleh CPU, yang lebih lambat dari GPU.

Contoh

Untuk memahami perbedaannya, ada baiknya melihat beberapa contoh. Jelas, dalam sebuah game, rendering bisa berupa perangkat keras dan perangkat lunak. Sebagai contoh, kita semua ingat Quake 2 yang terkenal. Jadi, air dalam game bisa menjadi filter biru dalam hal rendering perangkat keras. Tetapi dengan intervensi terprogram, percikan air muncul. Ini cerita yang sama dengan CS 1.6. Render perangkat keras hanya memberikan kilatan putih, sedangkan rendering perangkat lunak menambahkan layar berpiksel.

Mengakses

Jadi menjadi jelas bahwa perlu untuk memecahkan masalah seperti itu. Akselerator grafis mulai memperluas jumlah algoritme yang populer di kalangan pengembang. Menjadi jelas bahwa tidak mungkin untuk "mengisi" semuanya. Itu perlu untuk membuka akses ke spesialis kartu video.

Sebelum ada game seperti "Minecraft" dengan mod dan shader, pengembang diberi kesempatan untuk bekerja dengan blok GPU dalam pipeline yang dapat bertanggung jawab atas instruksi yang berbeda. Ini adalah bagaimana program dengan nama "shader" menjadi dikenal. Untuk membuatnya, bahasa pemrograman dikembangkan secara khusus. Jadi, kartu video mulai dimuat tidak hanya dengan "geometri" standar, tetapi juga dengan instruksi untuk prosesor.

Ketika akses tersebut menjadi mungkin, kemungkinan pemrograman baru mulai terbuka. Spesialis dapat memecahkan masalah matematika pada GPU. Perhitungan ini kemudian dikenal sebagai GPGPU. Proses ini membutuhkan alat khusus. Dari nVidia CUDA, dari Microsoft DirectCompute, dan kerangka kerja OpenCL.

Jenis

Semakin banyak orang mempelajari apa itu shader, semakin banyak informasi tentang mereka dan kemampuan mereka terungkap. Awalnya, akselerator memiliki tiga prosesor. Masing-masing bertanggung jawab atas jenis shadernya sendiri. Seiring waktu, mereka digantikan oleh yang universal. Masing-masing memiliki seperangkat instruksi tertentu yang memiliki tiga jenis shader sekaligus. Terlepas dari penyatuan pekerjaan, deskripsi masing-masing jenis bertahan hingga hari ini.

Jenis simpul bekerja dengan simpul bentuk yang memiliki banyak wajah. Ada banyak alat yang terlibat. Misalnya, kita berbicara tentang koordinat tekstur, vektor garis singgung, binormal atau normal.

Tipe geometris bekerja tidak hanya dengan satu simpul, tetapi juga dengan seluruh primitif. Pixel dirancang untuk memproses fragmen ilustrasi bitmap dan tekstur secara umum.

Dalam permainan

Jika Anda mencari shader untuk Minecraft 1.5.2, kemungkinan besar Anda hanya ingin meningkatkan gambar dalam gim. Untuk memungkinkan hal ini, program-program tersebut melalui "pipa api, air, dan tembaga". Shader diuji dan disempurnakan. Akibatnya, menjadi jelas bahwa alat ini memiliki kelebihan dan kekurangan.

Tentu saja, kesederhanaan dalam mengkompilasi berbagai algoritma merupakan nilai tambah yang besar. Ini adalah fleksibilitas dan penyederhanaan yang nyata dalam proses pengembangan game, dan oleh karena itu, penurunan biaya. Adegan virtual yang dihasilkan menjadi lebih kompleks dan realistis. Selain itu, proses pengembangannya sendiri menjadi berkali-kali lipat lebih cepat.

Dari kekurangannya, perlu dicatat bahwa Anda harus mempelajari salah satu bahasa pemrograman, dan juga memperhitungkan bahwa set algoritme yang berbeda terletak pada model kartu video yang berbeda.

Instalasi

Jika Anda telah menemukan paket shader untuk Minecraft, Anda perlu memahami bahwa ada banyak jebakan dalam pemasangannya. Meskipun popularitas game ini sudah memudar, penggemar setianya masih tetap ada. Tidak semua orang menyukai grafis, terutama di tahun 2017. Beberapa orang berpikir bahwa berkat shader mereka akan dapat memperbaikinya. Secara teori, pernyataan ini benar. Namun dalam praktiknya, Anda tidak akan banyak berubah.

Tetapi jika Anda masih mencari cara di "Minecraft 1.7", maka, pertama-tama, berhati-hatilah. Prosesnya sendiri tidak rumit. Selain itu, bersama dengan file yang diunduh, ada instruksi untuk pemasangannya. Hal utama adalah memeriksa versi gim dan shader. Jika tidak, pengoptimal akan gagal.

Ada banyak tempat di Internet di mana Anda dapat menginstal dan mengunduh alat semacam itu. Selanjutnya, Anda perlu membongkar arsip ke folder apa pun. Di sana Anda akan menemukan file "GLSL-Shaders-Mod-1.7-Installer.jar". Setelah memulai, Anda akan diperlihatkan jalan menuju permainan, jika benar, maka setujui semua instruksi selanjutnya.

Kemudian Anda perlu memindahkan folder "shaderpacks" ke ".minecraft". Sekarang, ketika Anda memulai peluncur, Anda harus pergi ke pengaturan. Di sini, jika pemasangannya benar, garis "Shaders" akan muncul. Anda dapat memilih paket yang Anda inginkan dari seluruh daftar.

Jika Anda membutuhkan shader untuk Minecraft 1.7.10, cari saja shaderpack dari versi yang diperlukan dan lakukan hal yang sama. Versi yang tidak stabil dapat ditemukan di Internet. Terkadang Anda harus mengubah, menginstal ulang dan mencari yang cocok. Lebih baik melihat ulasan dan memilih yang paling populer.

pengantar

Dunia grafis 3D, termasuk game, penuh dengan istilah. Istilah yang tidak selalu memiliki satu-satunya definisi yang benar. Terkadang hal yang sama disebut berbeda, dan sebaliknya, efek yang sama bisa disebut "HDR", lalu "Bloom", lalu "Glow", lalu "Postprocessing" di pengaturan game. Kebanyakan orang, di luar kebanggaan pengembang tentang apa yang telah mereka bangun ke dalam mesin grafis mereka, bingung tentang apa yang sebenarnya mereka maksud.

Artikel ini dimaksudkan untuk membantu Anda mengetahui arti dari beberapa kata ini, yang paling sering digunakan dalam kasus seperti itu. Dalam kerangka artikel ini, kami tidak akan berbicara tentang semua istilah grafis 3D, tetapi hanya tentang yang telah menjadi lebih luas dalam beberapa tahun terakhir sebagai fitur dan teknologi khusus yang digunakan dalam mesin grafis game dan sebagai nama untuk pengaturan grafis game modern. . Sebagai permulaan, saya sangat menyarankan Anda membiasakan diri.

Jika sesuatu dalam artikel ini dan artikel Alexander tidak jelas bagi Anda, maka masuk akal untuk memulai dari awal, hal. Artikel-artikel ini sudah agak ketinggalan zaman, tentu saja, tetapi data dasar, paling awal dan penting ada di sana. Kami akan membicarakan lebih banyak istilah "tingkat lebih tinggi" dengan Anda. Anda harus memiliki pemahaman dasar tentang grafik waktu nyata 3D dan saluran grafik. Di sisi lain, jangan mengharapkan rumus matematika, ketepatan akademik, dan contoh kode - bukan itu yang dibahas dalam artikel ini. Ketentuan

Daftar istilah yang dijelaskan dalam artikel:

bayangan

Shader dalam arti luas adalah program untuk mendefinisikan permukaan suatu objek secara visual. Ini bisa berupa deskripsi pencahayaan, tekstur, pasca-pemrosesan, dll. Shader berevolusi dari pohon peneduh Cook dan bahasa aliran piksel Perlin. RenderMan Shading Language sekarang yang paling terkenal. Shader yang dapat diprogram pertama kali diperkenalkan di RenderMan Pixar, yang mendefinisikan beberapa jenis shader: shader sumber cahaya, shader permukaan, shader perpindahan, shader volume, imager shader. Shader ini paling sering dieksekusi dalam perangkat lunak oleh prosesor universal dan tidak memiliki implementasi perangkat keras penuh. Kemudian, banyak peneliti menggambarkan bahasa yang mirip dengan RenderMan, tetapi mereka sudah dirancang untuk akselerasi perangkat keras: sistem PixelFlow (Olano dan Lastra ), Quake Shader Language (digunakan oleh id Software di mesin grafis game Quake III, yang menjelaskan rendering multi-pass), dll. Peercy dan rekan-rekannya mengembangkan teknik untuk mengeksekusi program dengan loop dan kondisi pada arsitektur perangkat keras tradisional menggunakan beberapa rendering pass. shader RenderMan pecah menjadi beberapa Jumlah lintasan yang digabungkan dalam framebuffer. Kemudian ada bahasa yang kami lihat dipercepat perangkat keras di DirectX dan OpenGL. Beginilah cara shader diadaptasi untuk aplikasi grafik waktu nyata.

Chip video awal tidak dapat diprogram dan hanya melakukan tindakan yang telah diprogram sebelumnya (fungsi tetap), misalnya, algoritme pencahayaan dipasang secara kaku di perangkat keras, dan tidak ada yang dapat diubah. Kemudian, produsen chip video secara bertahap memperkenalkan elemen programabilitas ke dalam chip mereka, pada awalnya ini adalah kemampuan yang sangat lemah (NV10, yang dikenal sebagai NVIDIA GeForce 256, sudah mampu untuk beberapa program primitif), yang tidak menerima dukungan perangkat lunak di Microsoft DirectX API, tapi sejak waktu, kemungkinan terus berkembang. Langkah selanjutnya adalah untuk NV20 (GeForce 3) dan NV2A (chip video yang digunakan di konsol game Microsoft Xbox), yang menjadi chip pertama dengan dukungan perangkat keras untuk shader DirectX API. Versi Shader Model 1.0 / 1.1, yang muncul di DirectX 8, sangat terbatas, setiap shader (terutama untuk yang piksel) dapat memiliki panjang yang relatif kecil dan menggabungkan serangkaian instruksi yang sangat terbatas. Kemudian, Shader Model 1 (singkatnya SM1) ditingkatkan dengan Pixel Shaders 1.4 (ATI R200), yang menawarkan lebih banyak fleksibilitas, tetapi juga memiliki kemampuan yang terlalu terbatas. Shader pada waktu itu ditulis dalam apa yang disebut bahasa assembly shader, yang dekat dengan bahasa assembly untuk prosesor tujuan umum. Levelnya yang rendah membuat sulit untuk memahami kode dan pemrograman, terutama ketika kode programnya besar, karena jauh dari keanggunan dan struktur bahasa pemrograman modern.

Versi Shader Model 2.0 (SM2), yang muncul di DirectX 9 (yang didukung oleh chip video ATI R300, yang menjadi GPU pertama dengan dukungan untuk model shader 2.0), secara signifikan memperluas kemampuan shader real-time, menawarkan lebih lama dan shader yang lebih kompleks dan serangkaian instruksi yang diperluas secara signifikan. Kemampuan untuk menghitung floating point di pixel shader ditambahkan, yang juga merupakan peningkatan besar. DirectX 9, dalam menghadapi kemampuan SM2, juga memperkenalkan bahasa shader tingkat tinggi (HLSL), yang sangat mirip dengan bahasa C. Dan kompiler efisien yang menerjemahkan program HLSL menjadi kode tingkat rendah yang ramah perangkat keras. Selain itu, ada beberapa profil yang tersedia untuk arsitektur perangkat keras yang berbeda. Sekarang, pengembang dapat menulis satu kode shader HLSL dan mengompilasinya menggunakan DirectX ke dalam program optimal untuk chip video yang diinstal oleh pengguna. Setelah itu, chip dari NVIDIA, NV30 dan NV40 dirilis, yang meningkatkan kemampuan hardware shader satu langkah lebih jauh, menambahkan shader yang lebih panjang, kemungkinan transisi dinamis dalam vertex dan pixel shader, kemampuan untuk mengambil tekstur dari vertex shader, dll. tidak, mereka diharapkan menjelang akhir tahun 2006 di DirectX 10 ...

Secara umum, shader telah menambahkan banyak kemungkinan baru ke saluran grafik untuk mengubah dan menerangi simpul dan memproses piksel secara individual seperti yang diinginkan oleh pengembang setiap aplikasi tertentu. Namun, kemampuan shader perangkat keras belum sepenuhnya terungkap dalam aplikasi, dan karena kemampuannya meningkat di setiap generasi perangkat keras baru, kita akan segera melihat tingkat shader RenderMan yang dulunya tampak tidak terjangkau untuk akselerator video game. Sejauh ini, dalam model shader waktu nyata yang didukung oleh akselerator video perangkat keras, hanya dua jenis shader yang ditentukan: dan (dalam definisi DirectX 9 API). DirectX 10 berjanji akan ditambahkan ke mereka di masa mendatang.

Vertex Shader

Vertex shader adalah program yang dieksekusi oleh chip video yang melakukan operasi matematika dengan simpul (simpul, mereka membuat objek 3D dalam game), dengan kata lain, mereka menyediakan kemampuan untuk mengeksekusi algoritma yang dapat diprogram untuk mengubah parameter simpul dan pencahayaannya (T&L - Transformasi & Pencahayaan) ... Setiap simpul didefinisikan oleh beberapa variabel, misalnya posisi simpul dalam ruang 3D ditentukan oleh koordinat: x, y dan z. Vertikal juga dapat dideskripsikan dengan karakteristik warna, koordinat tekstur, dan sejenisnya. Vertex shader, tergantung pada algoritme, mengubah data ini selama pekerjaan mereka, misalnya, menghitung dan menulis koordinat dan / atau warna baru. Artinya, data input dari vertex shader adalah data tentang salah satu vertex dari model geometrik yang sedang diproses. Biasanya ini adalah koordinat spasial, normal, komponen warna, dan koordinat tekstur. Data yang dihasilkan dari program yang dieksekusi berfungsi sebagai input untuk bagian selanjutnya dari pipeline, rasterizer membuat interpolasi linier dari data input untuk permukaan segitiga dan untuk setiap piksel mengeksekusi pixel shader yang sesuai. Contoh yang sangat sederhana dan kasar (tapi jelas, saya harap): vertex shader memungkinkan Anda untuk mengambil objek bola 3D dan menggunakan vertex shader untuk membuat kubus hijau darinya :).

Sebelum munculnya chip video NV20, pengembang memiliki dua cara, baik menggunakan program dan algoritma mereka sendiri yang mengubah parameter titik, tetapi kemudian semua perhitungan akan dilakukan oleh CPU (T&L perangkat lunak), atau mengandalkan algoritma tetap di chip video, dengan dukungan untuk transformasi dan pencahayaan perangkat keras (T&L perangkat keras). Model shader DirectX pertama berarti langkah maju yang besar dari fungsi tetap untuk mengubah dan menerangi simpul ke algoritme yang dapat diprogram sepenuhnya. Menjadi mungkin, misalnya, untuk mengeksekusi algoritma skinning seluruhnya pada chip video, dan sebelumnya satu-satunya kemungkinan adalah eksekusi mereka pada prosesor pusat universal. Sekarang, dengan kemampuan yang sangat meningkat sejak masa chip NVIDIA yang disebutkan di atas, Anda dapat melakukan banyak hal dengan simpul menggunakan shader simpul (kecuali untuk pembuatannya, mungkin) ...

Contoh bagaimana dan di mana vertex shader diterapkan:

Pixel Shader

Pixel shader adalah program yang dijalankan oleh chip video selama rasterisasi untuk setiap piksel dalam gambar; mereka melakukan pengambilan sampel tekstur dan / atau operasi matematika pada warna dan nilai kedalaman (Z-buffer) piksel. Semua instruksi pixel shader dieksekusi pixel demi pixel setelah transformasi geometri dan operasi pencahayaan selesai. Sebagai hasil kerjanya, pixel shader menghasilkan nilai akhir dari warna piksel dan nilai Z untuk tahap berikutnya dari jalur grafik, pencampuran. Contoh paling sederhana dari pixel shader yang dapat dikutip: banal multitexturing, hanya mencampur dua tekstur (diffuse dan lightmap, misalnya) dan memaksakan hasil perhitungan pada sebuah pixel.

Sebelum munculnya chip video dengan dukungan perangkat keras untuk pixel shader, pengembang hanya memiliki peluang untuk multitekstur konvensional dan pencampuran alfa, yang secara signifikan membatasi kemungkinan banyak efek visual dan tidak memungkinkan melakukan banyak hal yang sekarang tersedia. Dan jika dengan geometri sesuatu yang lain dapat dilakukan secara terprogram, maka dengan piksel - tidak. Versi awal DirectX (hingga 7.0 inklusif) selalu melakukan semua perhitungan secara vertikal dan menawarkan fungsionalitas yang sangat terbatas untuk pencahayaan per piksel (ingat EMBM - pemetaan benjolan lingkungan dan DOT3) di versi terbaru. Pixel shader memungkinkan untuk menerangi permukaan piksel demi piksel menggunakan materi yang diprogram pengembang. Pixel shader 1.1 (dalam pengertian DirectX) yang muncul di NV20 tidak hanya dapat melakukan multitekstur, tetapi juga lebih banyak lagi, meskipun sebagian besar game yang menggunakan SM1 hanya menggunakan multitekstur tradisional pada sebagian besar permukaan, melakukan shader piksel yang lebih kompleks hanya pada sebagian permukaan, untuk menciptakan berbagai efek khusus (semua orang tahu bahwa air masih merupakan contoh paling umum dari penggunaan pixel shader dalam game). Sekarang, setelah munculnya SM3 dan chip video yang mendukungnya, kemampuan pixel shader telah berkembang bahkan memungkinkan raytracing, meskipun dengan beberapa keterbatasan.

Contoh penggunaan pixel shader:

Tekstur Prosedural

Tekstur prosedural adalah tekstur yang dijelaskan oleh rumus matematika. Tekstur seperti itu tidak memakan ruang dalam memori video, mereka dibuat oleh pixel shader "on the fly", masing-masing elemennya (texel) diperoleh sebagai hasil dari menjalankan perintah shader yang sesuai. Tekstur prosedural yang paling umum: berbagai jenis kebisingan (misalnya, kebisingan fraktal), kayu, air, lava, asap, marmer, api, dll., Yaitu, yang dapat dijelaskan secara matematis dengan cara yang relatif sederhana. Tekstur prosedural juga memungkinkan Anda untuk menggunakan tekstur animasi hanya dengan sedikit modifikasi pada rumus matematika. Misalnya, awan yang dibuat dengan cara ini terlihat cukup bagus baik dalam dinamika maupun statika.

Kelebihan dari tekstur prosedural juga mencakup tingkat detail yang tidak terbatas untuk setiap tekstur, tidak akan ada pikselasi, tekstur selalu dihasilkan sesuai dengan ukuran yang diperlukan untuk menampilkannya. Animasi juga sangat menarik, dengan bantuannya Anda dapat membuat gelombang di atas air, tanpa menggunakan tekstur animasi yang telah dihitung sebelumnya. Kelebihan lain dari tekstur semacam itu adalah semakin banyak digunakan dalam suatu produk, semakin sedikit pekerjaan bagi seniman (walaupun lebih banyak untuk programmer) untuk membuat tekstur biasa.

Sayangnya, tekstur prosedural belum digunakan dengan benar dalam permainan, dalam aplikasi nyata masih sering lebih mudah untuk memuat tekstur biasa, volume memori video tumbuh dengan pesat, di akselerator paling modern mereka sudah menginstal 512 megabyte video khusus memori, yang dibutuhkan lebih dari meminjam sesuatu. Selain itu, mereka masih sering melakukan yang sebaliknya - untuk mempercepat matematika di pixel shader, tabel pencarian (LUT) digunakan - tekstur khusus yang berisi nilai yang telah dihitung sebelumnya diperoleh sebagai hasil dari perhitungan. Agar tidak menghitung beberapa instruksi matematika untuk setiap piksel, mereka cukup membaca nilai yang telah dihitung sebelumnya dari tekstur. Namun semakin jauh, semakin banyak penekanan yang harus beralih ke perhitungan matematis, ambil chip video ATI generasi baru yang sama: RV530 dan R580, yang masing-masing memiliki prosesor 12 dan 48 piksel untuk setiap 4 dan 16 unit tekstur. Terlebih lagi, jika kita berbicara tentang tekstur 3D, karena jika tekstur dua dimensi dapat ditempatkan di memori lokal akselerator tanpa masalah, maka tekstur 3D membutuhkan lebih banyak lagi.

Contoh tekstur prosedural:

Pemetaan Bump / Pemetaan Bump Specular

Bumpmapping adalah teknik untuk mensimulasikan ketidakteraturan (atau memodelkan microrelief, sesuka Anda) pada permukaan datar tanpa biaya komputasi yang besar dan perubahan geometri. Untuk setiap piksel di permukaan, perhitungan pencahayaan dilakukan berdasarkan nilai dalam peta ketinggian khusus yang disebut bumpmap. Ini biasanya tekstur hitam putih 8-bit dan nilai warna tekstur tidak dilapis seperti tekstur biasa, tetapi digunakan untuk menggambarkan kekasaran permukaan. Warna setiap texel menentukan ketinggian titik relief yang sesuai, nilai yang lebih tinggi berarti ketinggian yang lebih tinggi di atas permukaan asli, dan nilai yang lebih rendah, masing-masing, lebih rendah. Atau sebaliknya.

Derajat iluminasi suatu titik bergantung pada sudut datang berkas cahaya. Semakin kecil sudut antara normal dan sinar cahaya, semakin besar iluminasi suatu titik di permukaan. Artinya, jika Anda mengambil permukaan datar, maka normal di setiap titik akan sama dan iluminasi juga akan sama. Dan jika permukaannya tidak rata (pada kenyataannya, hampir semua permukaan adalah kenyataan), maka normal di setiap titik akan berbeda. Dan iluminasi berbeda, pada satu titik akan lebih banyak, di titik lain - lebih sedikit. Oleh karena itu prinsip bumpmapping - untuk mensimulasikan ketidakteraturan untuk berbagai titik poligon, normal permukaan ditetapkan, yang diperhitungkan saat menghitung pencahayaan per piksel. Hasilnya, gambar permukaan yang lebih alami diperoleh, bumpmapping memberikan permukaan yang lebih detail, seperti tonjolan pada batu bata, pori-pori pada kulit, dll., tanpa meningkatkan kompleksitas geometrik model, karena perhitungan dilakukan pada tingkat piksel. Selain itu, ketika posisi sumber cahaya berubah, iluminasi ketidakteraturan ini berubah dengan benar.

Tentu saja, pencahayaan titik jauh lebih sederhana secara komputasi, tetapi terlihat terlalu tidak realistis, terutama dengan geometri poli yang relatif rendah, interpolasi warna untuk setiap piksel tidak dapat mereproduksi nilai yang lebih besar daripada nilai yang dihitung untuk titik. Artinya, piksel di tengah segitiga tidak boleh lebih terang daripada fragmen di dekat simpul. Akibatnya, area dengan perubahan iluminasi yang tiba-tiba, seperti silau dan sumber cahaya yang sangat dekat dengan permukaan, secara fisik akan salah ditampilkan, dan ini terutama terlihat dalam dinamika. Tentu saja, sebagian masalah dapat diselesaikan dengan meningkatkan kompleksitas geometris model, membaginya menjadi lebih banyak simpul dan segitiga, tetapi pencahayaan piksel demi piksel adalah pilihan terbaik.

Untuk melanjutkan, Anda perlu mengingat kembali komponen pencahayaan. Warna titik permukaan dihitung sebagai jumlah dari komponen ambient, diffuse dan specular dari semua sumber cahaya di tempat kejadian (idealnya dari semua, sering diabaikan oleh banyak orang). Kontribusi nilai ini dari setiap sumber cahaya tergantung pada jarak antara sumber cahaya dan titik di permukaan.

Komponen pencahayaan:

Sekarang mari tambahkan beberapa pemetaan benjolan ke ini:

Komponen pencahayaan (ambien) yang seragam adalah pencahayaan aproksimasi, "awal" untuk setiap titik pemandangan, di mana semua titik diterangi secara merata dan pencahayaan tidak bergantung pada faktor lain.
Komponen difusi cahaya tergantung pada posisi sumber cahaya dan pada permukaan normal. Komponen pencahayaan ini berbeda untuk setiap titik objek, yang memberi mereka volume. Cahaya tidak lagi memenuhi permukaan dengan bayangan yang sama.
Komponen spekular iluminasi muncul sebagai pantulan sinar cahaya dari permukaan. Untuk perhitungannya, selain vektor posisi sumber cahaya dan normal, dua vektor lagi digunakan: vektor arah pandangan dan vektor pantulan. Model pencahayaan Specular pertama kali diusulkan oleh Phong Bui-Tong. Flare ini secara signifikan meningkatkan realisme gambar, karena permukaan nyata yang jarang tidak memantulkan cahaya, sehingga komponen specular sangat penting. Terutama dalam gerakan, karena silau langsung menunjukkan perubahan posisi kamera atau objek itu sendiri. Kemudian, para peneliti menemukan cara lain untuk menghitung komponen ini, yang lebih kompleks (Blinn, Cook-Torrance, Ward), dengan mempertimbangkan distribusi energi cahaya, penyerapannya oleh bahan dan hamburan dalam bentuk komponen difus.

Jadi, Specular Bump Mapping diperoleh dengan cara ini:

Dan mari kita lihat sama dengan contoh permainannya, Call of Duty 2:


Fragmen pertama dari gambar adalah rendering tanpa bumpmapping () sama sekali, yang kedua (kanan atas) adalah bumpmapping tanpa komponen specular, yang ketiga dengan komponen specular dengan magnitudo normal, yang digunakan dalam game, dan yang terakhir , dari kanan-bawah, dengan komponen specular semaksimal mungkin.

Adapun aplikasi perangkat keras pertama, beberapa jenis bumpmapping (Emboss Bump Mapping) mulai digunakan kembali pada hari-hari kartu video berbasis chip NVIDIA Riva TNT, tetapi teknik waktu itu sangat primitif dan tidak banyak digunakan. Jenis berikutnya yang diketahui adalah Environment Mapped Bump Mapping (EMBM), tetapi hanya kartu video Matrox yang memiliki dukungan perangkat keras di DirectX pada waktu itu, dan sekali lagi penggunaannya sangat terbatas. Kemudian Dot3 Bump Mapping muncul dan chip video pada waktu itu (GeForce 256 dan GeForce 2) membutuhkan tiga lintasan untuk sepenuhnya mengeksekusi algoritme matematika seperti itu, karena dibatasi oleh dua tekstur yang digunakan secara bersamaan. Dimulai dengan NV20 (GeForce3), menjadi mungkin untuk melakukan hal yang sama dalam sekali jalan menggunakan pixel shader. Lebih-lebih lagi. Mereka mulai menggunakan teknik yang lebih efektif seperti.

Contoh penggunaan bumpmapping dalam game:


Pemetaan Perpindahan adalah metode menambahkan detail ke objek 3D. Tidak seperti bumpmapping dan metode per-piksel lainnya, ketika hanya iluminasi titik yang dimodelkan dengan benar oleh peta ketinggian, tetapi posisinya dalam ruang tidak berubah, yang hanya memberikan ilusi peningkatan kompleksitas permukaan, peta perpindahan memungkinkan Anda untuk mendapatkan objek 3D kompleks nyata dari simpul dan poligon, tanpa batasan yang melekat dalam metode per-piksel. Metode ini memposisikan ulang simpul segitiga dengan menormalkannya dengan jumlah berdasarkan nilai dalam peta perpindahan. Peta perpindahan biasanya berupa tekstur hitam dan putih, dan nilai-nilai di dalamnya digunakan untuk menentukan ketinggian setiap titik pada permukaan suatu objek (nilai dapat disimpan sebagai angka 8-bit atau 16-bit) , mirip dengan bumpmap. Peta perpindahan sering digunakan (dalam hal ini juga disebut peta ketinggian) untuk membuat medan dengan bukit dan lembah. Karena medan digambarkan oleh peta perpindahan dua dimensi, maka relatif mudah untuk mengubah bentuknya jika perlu, karena hanya memerlukan modifikasi peta perpindahan dan rendering permukaan berdasarkan itu pada bingkai berikutnya.

Pembuatan lanskap menggunakan overlay peta perpindahan terlihat jelas pada gambar. Awalnya, 4 simpul dan 2 poligon digunakan, sebagai hasilnya, bagian lanskap yang lengkap ternyata.

Keuntungan besar dari overlay peta perpindahan bukan hanya kemampuan untuk menambahkan detail ke permukaan, tetapi pembuatan objek yang hampir lengkap. Sebuah objek poli-rendah diambil, dibagi (diuji) menjadi lebih banyak simpul dan poligon. Titik-titik yang dihasilkan oleh tessellation kemudian dipindahkan sepanjang normal berdasarkan nilai yang terbaca pada peta perpindahan. Kami berakhir dengan objek 3D yang kompleks dari yang sederhana menggunakan peta perpindahan yang sesuai:


Jumlah segitiga yang dibuat oleh tessellation harus cukup besar untuk menangkap semua detail yang ditentukan oleh peta perpindahan. Terkadang segitiga tambahan dibuat secara otomatis menggunakan N-patches atau metode lain. Peta perpindahan paling baik digunakan bersama dengan pemetaan bump untuk membuat detail halus di mana pencahayaan piksel-demi-piksel yang tepat cukup.

Pemetaan perpindahan pertama kali didukung di DirectX 9.0. Ini adalah versi pertama dari API ini yang mendukung teknik Pemetaan Pemindahan. DX9 mendukung dua jenis pemetaan perpindahan, disaring dan diprasampelkan. Metode pertama didukung oleh chip video MATROX Parhelia yang terlupakan, dan yang kedua - oleh ATI RADEON 9700. Metode yang difilter berbeda karena memungkinkan penggunaan level mip untuk peta perpindahan dan menerapkan pemfilteran trilinear untuknya. Dalam metode ini, tingkat mip dari peta perpindahan dipilih untuk setiap titik berdasarkan jarak dari titik ke kamera, yaitu, tingkat detail dipilih secara otomatis. Ini mencapai pembagian pemandangan yang hampir merata ketika segitiga berukuran kira-kira sama.

Pemetaan perpindahan pada dasarnya dapat dianggap sebagai teknik kompresi geometri; menggunakan peta perpindahan mengurangi jumlah memori yang dibutuhkan untuk tingkat detail tertentu dalam model 3D. Data geometri besar digantikan oleh tekstur perpindahan 2D sederhana, biasanya 8-bit atau 16-bit. Hal ini mengurangi jumlah memori dan bandwidth yang diperlukan untuk mengirimkan data geometri ke chip video, dan kendala ini adalah salah satu kendala utama dalam sistem saat ini. Atau, dengan bandwidth dan persyaratan penyimpanan yang sama, pemetaan perpindahan memungkinkan model 3D geometris yang jauh lebih kompleks. Penggunaan model dengan kompleksitas yang jauh lebih rendah, ketika alih-alih puluhan atau ratusan ribu segitiga, unit ribuan digunakan, itu juga memungkinkan untuk mempercepat animasi mereka. Atau tingkatkan dengan menerapkan algoritme dan teknik yang lebih kompleks, seperti simulasi kain.

Keuntungan lain adalah bahwa menggunakan peta perpindahan mengubah mesh 3D poligonal kompleks menjadi beberapa tekstur 2D yang lebih mudah untuk dimanipulasi. Misalnya, untuk organisasi, Anda dapat menggunakan pemetaan mip biasa untuk melapisi peta perpindahan. Selain itu, alih-alih algoritme yang relatif rumit untuk mengompresi mesh tiga dimensi, Anda dapat menggunakan metode biasa untuk mengompresi tekstur, bahkan yang mirip JPEG. Dan untuk pembuatan prosedural objek 3D, Anda dapat menggunakan algoritme biasa untuk tekstur 2D.

Tetapi peta perpindahan juga memiliki beberapa keterbatasan, mereka tidak dapat diterapkan di semua situasi. Misalnya, objek halus yang tidak mengandung banyak detail halus akan lebih baik direpresentasikan sebagai jerat standar atau permukaan tingkat tinggi lainnya seperti kurva Bezier. Di sisi lain, model yang sangat kompleks seperti pohon atau tumbuhan juga tidak mudah direpresentasikan dengan peta perpindahan. Ada juga masalah dengan kenyamanan penggunaannya, ini hampir selalu membutuhkan utilitas khusus, karena sangat sulit untuk membuat peta perpindahan secara langsung (jika kita tidak berbicara tentang objek sederhana, seperti lanskap). Banyak masalah dan keterbatasan yang melekat pada peta perpindahan adalah sama dengan masalah, karena kedua metode tersebut pada dasarnya adalah dua representasi yang berbeda dari ide yang sama.

Sebagai contoh dari game nyata, saya akan mengutip game yang menggunakan sampling tekstur dari vertex shader, fitur yang telah muncul di chip video NVIDIA NV40 dan Shader Model 3.0. Tekstur vertex dapat diterapkan pada metode sederhana untuk melapisi peta perpindahan yang sepenuhnya dilakukan oleh GPU, tanpa tessellation (membagi menjadi lebih banyak segitiga). Penggunaan algoritma semacam itu terbatas, mereka masuk akal hanya jika petanya dinamis, yaitu, mereka akan berubah dalam prosesnya. Misalnya, ini adalah rendering permukaan air besar, yang dilakukan dalam game Pacific Fighters:


Normalmapping adalah versi perbaikan dari teknik bumpmapping yang dijelaskan sebelumnya, versi diperpanjang dari itu. Bumpmapping dikembangkan oleh Blinn pada tahun 1978, di mana normal permukaan diubah dengan metode pemetaan medan ini berdasarkan informasi dari peta benjolan. Sementara bumpmapping hanya mengubah normal yang ada untuk titik permukaan, normalmapping sepenuhnya menggantikan normal dengan mengambil nilainya dari peta normal yang disiapkan khusus. Peta-peta ini biasanya tekstur dengan nilai normal pra-perhitungan yang tersimpan di dalamnya, direpresentasikan sebagai komponen warna RGB (namun, ada juga format khusus untuk peta normal, termasuk yang memiliki kompresi), berbeda dengan tinggi hitam putih 8-bit peta dalam bumpmapping.

Secara umum, seperti bumpmapping, ini juga merupakan metode "murah" untuk menambahkan detail ke model dengan kompleksitas geometris yang relatif rendah, tanpa menggunakan geometri yang lebih nyata, hanya lebih maju. Salah satu kegunaan yang paling menarik dari teknik ini adalah untuk secara signifikan meningkatkan detail model poli rendah menggunakan peta normal yang diperoleh dengan memproses model kompleksitas geometris tinggi yang sama. Peta normal memberikan deskripsi permukaan yang lebih detail daripada bumpmapping dan memungkinkan Anda untuk merepresentasikan bentuk yang lebih kompleks. Gagasan untuk memperoleh informasi dari objek yang sangat detail disuarakan pada pertengahan 90-an abad terakhir, tetapi kemudian tentang penggunaan untuk. Kemudian, pada tahun 1998, muncul ide untuk mentransfer detail dalam bentuk peta normal dari model poli tinggi ke poli rendah.

Peta normal menyediakan cara yang lebih efisien untuk menyimpan data permukaan rinci daripada hanya menggunakan poligon dalam jumlah besar. Satu-satunya batasan serius mereka adalah bahwa mereka tidak terlalu cocok untuk detail besar, karena pemetaan normal tidak benar-benar menambahkan poligon atau mengubah bentuk objek, itu hanya menciptakan tampilannya. Ini hanyalah simulasi detail berdasarkan perhitungan pencahayaan tingkat piksel. Pada poligon ekstrem objek dan sudut kemiringan permukaan yang besar, ini sangat terlihat. Oleh karena itu, cara paling masuk akal untuk menerapkan pemetaan normal adalah membuat model poli rendah cukup detail untuk mempertahankan bentuk dasar objek, dan menggunakan peta normal untuk menambahkan detail yang lebih halus.

Peta normal biasanya dihasilkan dari dua versi model, poli rendah dan tinggi. Model poli rendah terdiri dari geometri minimum, bentuk dasar objek, dan model poli tinggi berisi semua yang Anda butuhkan untuk detail maksimal. Kemudian, menggunakan utilitas khusus, mereka dibandingkan satu sama lain, perbedaannya dihitung dan disimpan dalam tekstur yang disebut peta normal. Saat membuatnya, Anda juga dapat menggunakan peta benjolan untuk detail yang sangat kecil yang tidak dapat dimodelkan bahkan dalam model poli-tinggi (pori-pori kulit, lekukan kecil lainnya).

Peta normal awalnya direpresentasikan sebagai tekstur RGB biasa, di mana komponen warna R, G dan B (0 hingga 1) diinterpretasikan sebagai koordinat X, Y dan Z. Setiap texel dalam peta normal direpresentasikan sebagai titik normal permukaan. Peta normal dapat terdiri dari dua jenis: dengan koordinat dalam ruang model (sistem koordinat umum) atau ruang singgung (istilah dalam bahasa Rusia adalah "ruang singgung", sistem koordinat lokal segitiga). Opsi kedua lebih sering digunakan. Ketika peta normal disajikan dalam ruang model, maka mereka harus memiliki tiga komponen, karena semua arah dapat diwakili, dan ketika dalam sistem koordinat lokal, ruang singgung, Anda dapat bertahan dengan dua komponen, dan mendapatkan yang ketiga dalam shader piksel .

Aplikasi real-time modern masih sangat mengungguli animasi pra-render dalam hal kualitas gambar, ini menyangkut, pertama-tama, kualitas pencahayaan dan kompleksitas geometris pemandangan. Jumlah simpul dan segitiga yang dihitung secara real time terbatas. Oleh karena itu, metode untuk mengurangi jumlah geometri sangat penting. Sebelum pemetaan normal, beberapa metode seperti itu dikembangkan, tetapi model poli rendah bahkan dengan bumpmapping jauh lebih buruk daripada model yang lebih kompleks. Meskipun pemetaan normal memiliki beberapa kelemahan (yang paling jelas adalah karena model tetap poli rendah, dapat dengan mudah dilihat dari batas sudutnya), kualitas rendering akhir meningkat secara nyata, meninggalkan kompleksitas geometris model yang rendah. Baru-baru ini, peningkatan popularitas teknik ini dan penggunaannya di semua mesin game populer telah terlihat jelas. Ini karena kombinasi kualitas hasil yang sangat baik dan pengurangan simultan dalam persyaratan untuk kompleksitas geometris model. Teknik pemetaan normal sekarang digunakan hampir di mana-mana, semua game baru menggunakannya seluas mungkin. Berikut adalah daftar singkat game PC terkenal yang menggunakan pemetaan normal: Far Cry, Doom 3, Half-Life 2, Call of Duty 2, FEAR, Quake 4. Semuanya terlihat jauh lebih baik daripada game sebelumnya, termasuk karena penggunaan peta normal.

Hanya ada satu konsekuensi negatif dari penggunaan teknik ini - peningkatan volume tekstur. Lagi pula, peta normal sangat mempengaruhi bagaimana objek akan terlihat, dan itu harus memiliki resolusi yang cukup besar, sehingga persyaratan untuk memori video dan bandwidthnya menjadi dua kali lipat (dalam kasus peta normal yang tidak terkompresi). Tapi sekarang kartu video dengan memori lokal 512 megabyte sudah diproduksi, bandwidthnya terus bertambah, metode kompresi telah dikembangkan khusus untuk peta normal, jadi pembatasan kecil ini sebenarnya tidak terlalu penting. Efek pemetaan normal jauh lebih besar, memungkinkan penggunaan model poli yang relatif rendah, mengurangi kebutuhan memori untuk menyimpan data geometris, meningkatkan kinerja, dan memberikan hasil visual yang sangat baik.

Pemetaan Paralaks / Pemetaan Offset

Pemetaan normal, dikembangkan kembali pada tahun 1984, diikuti oleh Pemetaan Tekstur Relief, yang diperkenalkan oleh Olivera dan Bishop pada tahun 1999. Ini adalah teknik pemetaan tekstur berdasarkan informasi kedalaman. Metode ini tidak menemukan aplikasi dalam permainan, tetapi idenya berkontribusi pada kelanjutan pekerjaan pemetaan paralaks dan peningkatannya. Kaneko memperkenalkan pemetaan paralaks pada tahun 2001, yang merupakan metode efisien pertama untuk membuat efek paralaks per piksel. Pada tahun 2004, Welsh mendemonstrasikan penggunaan pemetaan paralaks pada chip video yang dapat diprogram.

Metode ini mungkin memiliki nama yang paling berbeda. Saya akan membuat daftar yang saya temui: Pemetaan Paralaks, Pemetaan Offset, Pemetaan Perpindahan Virtual, Pemetaan Pemindahan Per-Pixel. Judul pertama digunakan dalam artikel untuk singkatnya.
Pemetaan paralaks adalah alternatif lain untuk pemetaan benjolan dan teknik pemetaan normal, yang memberi Anda lebih banyak wawasan tentang detail permukaan, tampilan permukaan 3D yang lebih alami, juga tanpa terlalu banyak penalti kinerja. Teknik ini mirip dengan pemetaan perpindahan dan pemetaan normal pada saat yang sama, berada di antara keduanya. Metode ini juga dirancang untuk menampilkan lebih banyak detail permukaan daripada model geometris aslinya. Mirip dengan pemetaan normal, tetapi perbedaannya adalah metode mendistorsi pemetaan tekstur dengan mengubah koordinat tekstur sehingga ketika Anda melihat permukaan dari sudut yang berbeda, terlihat cembung, meskipun pada kenyataannya permukaannya rata dan tidak berubah. . Dengan kata lain, Parallax Mapping adalah teknik untuk memperkirakan efek pergeseran titik permukaan tergantung pada perubahan sudut pandang.

Teknik ini menggeser koordinat tekstur (karenanya teknik ini kadang-kadang disebut pemetaan offset) sehingga permukaannya terlihat lebih bervolume. Ide di balik metode ini adalah mengembalikan koordinat tekstur dari titik di mana vektor tampilan berpotongan dengan permukaan. Ini membutuhkan penelusuran sinar (ray tracing) untuk peta ketinggian, tetapi jika tidak memiliki terlalu banyak perubahan nilai ("halus" atau "halus"), maka aproksimasi dapat dihilangkan. Metode ini baik untuk permukaan dengan ketinggian yang bervariasi, tanpa salah perhitungan persimpangan dan nilai offset yang besar. Algoritme sederhana seperti itu berbeda dari pemetaan normal dengan hanya tiga instruksi pixel shader: dua instruksi matematika dan satu pengambilan tambahan dari tekstur. Setelah koordinat tekstur baru dihitung, selanjutnya digunakan untuk membaca lapisan tekstur lainnya: tekstur dasar, peta normal, dll. Metode pemetaan paralaks pada chip video modern ini hampir sama efektifnya dengan pemetaan tekstur konvensional, dan hasilnya adalah tampilan permukaan yang lebih realistis daripada pemetaan normal sederhana.

Tetapi penggunaan pemetaan paralaks konvensional terbatas pada peta ketinggian dengan sedikit perbedaan nilai. Ketidakteraturan "curam" diproses oleh algoritma secara tidak benar, berbagai artefak muncul, tekstur "mengambang", dll. Beberapa metode yang dimodifikasi telah dikembangkan untuk meningkatkan teknik pemetaan paralaks. Beberapa peneliti (Yerex, Donnelly, Tatarchuk, Policarpo) telah menjelaskan metode baru yang meningkatkan algoritma awal. Hampir semua ide didasarkan pada ray tracing dalam pixel shader untuk menentukan perpotongan detail permukaan satu sama lain. Teknik yang dimodifikasi telah menerima beberapa nama berbeda: Pemetaan Paralaks dengan Oklusi, Pemetaan Paralaks dengan Fungsi Jarak, Pemetaan Oklusi Paralaks. Untuk singkatnya, kami akan menyebutnya semua Pemetaan Oklusi Paralaks.

Metode Pemetaan Oklusi Paralaks juga mencakup penelusuran sinar untuk menentukan ketinggian dan memperhitungkan visibilitas texel. Memang, jika dilihat dari sudut ke permukaan, texel saling menghalangi, dan dengan mengingat hal ini, Anda dapat menambahkan lebih banyak kedalaman pada efek paralaks. Gambar yang dihasilkan menjadi lebih realistis dan metode yang ditingkatkan tersebut dapat digunakan untuk relief yang lebih dalam, sangat bagus untuk menggambarkan dinding bata dan batu, trotoar, dll. Perlu dicatat secara khusus bahwa perbedaan utama antara Pemetaan Paralaks dan Pemetaan Perpindahan adalah perhitungannya. semua per-piksel, dan tidak dangkal. Inilah sebabnya mengapa metode ini memiliki nama seperti Pemetaan Pemindahan Virtual dan Pemetaan Pemindahan Per-Pixel. Lihat gambarnya, sulit dipercaya, tetapi batu-batu trotoar di sini hanyalah efek piksel demi piksel:

Metode ini memungkinkan Anda untuk menampilkan permukaan detail secara efektif tanpa jutaan simpul dan segitiga yang diperlukan saat menerapkan geometri ini. Pada saat yang sama, detail tinggi dipertahankan (kecuali untuk siluet / tepi) dan perhitungan animasi sangat disederhanakan. Teknik ini lebih murah daripada menggunakan geometri nyata, dan poligon yang digunakan secara signifikan lebih sedikit, terutama dalam kasus dengan detail yang sangat kecil. Ada banyak aplikasi untuk algoritme, dan paling cocok untuk batu, bata, dan sejenisnya.

Juga, keuntungan tambahan adalah bahwa peta ketinggian dapat berubah secara dinamis (permukaan air dengan gelombang, lubang peluru di dinding, dan banyak lagi). Kerugian dari metode ini adalah kurangnya siluet yang benar secara geometris (tepi objek), karena algoritmanya adalah piksel demi piksel dan bukan pemetaan perpindahan nyata. Tetapi menghemat kinerja dalam bentuk pengurangan beban pada transformasi, pencahayaan, dan animasi geometri. Menghemat memori video yang diperlukan untuk menyimpan data geometri dalam jumlah besar. Teknologi ini juga mendapat manfaat dari integrasi yang relatif sederhana ke dalam aplikasi yang ada dan penggunaan utilitas yang sudah dikenal yang digunakan untuk pemetaan normal dalam prosesnya.

Teknik ini telah digunakan dalam game kehidupan nyata baru-baru ini. Sejauh ini, mereka bertahan dengan pemetaan paralaks sederhana berdasarkan peta ketinggian statis, tanpa ray tracing dan menghitung persimpangan. Berikut adalah beberapa contoh bagaimana pemetaan paralaks dapat digunakan dalam game:

Pengolahan pasca

Dalam arti luas, pasca-pemrosesan adalah segala sesuatu yang terjadi setelah langkah-langkah pencitraan utama. Dengan kata lain, pasca-pemrosesan adalah setiap perubahan pada gambar setelah dirender. Pasca-pemrosesan adalah seperangkat alat untuk membuat efek visual khusus, dan pembuatannya dilakukan setelah pekerjaan utama rendering adegan selesai, yaitu, saat membuat efek pasca-pemrosesan, gambar raster yang sudah jadi digunakan.

Contoh sederhana dari sebuah foto: Anda telah memotret sebuah danau yang indah dengan tanaman hijau dalam cuaca cerah. Langit sangat cerah dan pepohonan terlalu gelap. Anda memuat foto ke editor grafis dan mulai mengubah kecerahan, kontras, dan parameter lain untuk area gambar atau untuk keseluruhan gambar. Tetapi Anda tidak lagi memiliki kesempatan untuk mengubah pengaturan kamera, Anda melakukan pemrosesan gambar yang sudah jadi. Ini adalah pasca-pemrosesan. Atau contoh lain: memilih latar belakang dalam fotografi potret dan menerapkan filter blur ke area tersebut untuk efek depth of field dengan kedalaman yang lebih besar. Artinya, ketika Anda mengubah atau memperbaiki bingkai di editor grafis, Anda sedang melakukan pasca-pemrosesan. Hal yang sama dapat dilakukan dalam game, secara real time.

Ada banyak kemungkinan berbeda untuk pemrosesan gambar pasca-rendering. Setiap orang mungkin telah melihat banyak yang disebut filter grafis di editor grafis. Inilah yang disebut postfilters: blur, deteksi tepi, pertajam, noise, smooth, emboss, dll. Ketika diterapkan pada rendering 3D real-time, ini dilakukan sebagai berikut - seluruh adegan dirender ke area khusus, render target, dan setelah rendering utama, gambar ini juga diproses menggunakan pixel shader dan baru kemudian ditampilkan di layar. Dari efek post-processing dalam game, yang paling umum digunakan adalah,,. Ada banyak efek pasca lainnya: noise, flare, distorsi, sepia, dll.

Berikut adalah beberapa contoh utama pasca-pemrosesan dalam aplikasi game:

Rentang Dinamis Tinggi (HDR)

Rentang Dinamis Tinggi (HDR) seperti yang diterapkan pada grafik 3D adalah rendering rentang dinamis tinggi. Inti dari HDR adalah untuk menggambarkan intensitas dan warna dengan kuantitas fisik yang nyata. Model biasa untuk menggambarkan suatu gambar adalah RGB, ketika semua warna direpresentasikan sebagai jumlah dari warna primer: merah, hijau dan biru, dengan intensitas berbeda dalam bentuk kemungkinan nilai integer dari 0 hingga 255 untuk masing-masing, dikodekan dengan delapan bit per warna. Rasio intensitas maksimum dengan minimum yang dapat ditampilkan oleh model atau perangkat tertentu disebut rentang dinamis. Jadi, rentang dinamis model RGB adalah 256: 1 atau 100: 1 cd / m 2 (dua kali lipat). Model untuk menggambarkan warna dan intensitas ini biasa disebut dengan Low Dynamic Range (LDR).

Kemungkinan nilai LDR untuk semua kasus jelas tidak cukup, seseorang dapat melihat rentang yang jauh lebih besar, terutama pada intensitas cahaya rendah, dan model RGB terlalu terbatas dalam kasus seperti itu (dan juga pada intensitas tinggi). Rentang dinamis penglihatan manusia adalah dari 10 -6 hingga 10 8 cd / m 2, yaitu, 10.000.000.000.000.000: 1 (14 kali lipat). Kita tidak dapat melihat seluruh rentang pada saat yang sama, tetapi rentang yang terlihat oleh mata pada waktu tertentu kira-kira 10.000: 1 (empat kali lipat). Visi beradaptasi dengan nilai-nilai dari bagian lain dari rentang iluminasi secara bertahap, menggunakan apa yang disebut adaptasi, yang dapat dengan mudah dijelaskan oleh situasi dengan mematikan lampu di sebuah ruangan di malam hari - pada awalnya mata melihat sangat sedikit, tetapi seiring waktu mereka beradaptasi dengan kondisi pencahayaan yang berubah dan melihat lebih banyak lagi. ... Hal yang sama terjadi ketika Anda mengubah lingkungan gelap kembali menjadi terang.

Jadi, rentang dinamis model deskripsi RGB tidak cukup untuk mewakili gambar yang dapat dilihat seseorang dalam kenyataan, model ini secara signifikan mengurangi kemungkinan nilai intensitas cahaya di bagian atas dan bawah rentang. Contoh paling umum yang dikutip dalam rekaman HDR adalah gambar ruangan yang gelap dengan jendela ke jalan yang terang pada hari yang cerah. Dengan model RGB, Anda bisa mendapatkan tampilan normal dari apa yang ada di luar jendela, atau hanya apa yang ada di dalam ruangan. Nilai di atas 100 cd / m 2 di LDR umumnya terpotong, itulah sebabnya sulit untuk merender sumber cahaya terang langsung ke kamera dalam rendering 3D.

Sejauh ini, perangkat tampilan data itu sendiri tidak dapat ditingkatkan secara serius, dan masuk akal untuk mengabaikan LDR dalam perhitungan, Anda dapat menggunakan nilai fisik nyata dari intensitas dan warna (atau proporsional linier), dan menampilkan maksimum yang dapat dilakukan. monitor. Inti dari representasi HDR adalah menggunakan nilai intensitas dan warna dalam kuantitas fisik nyata atau proporsional linier dan tidak menggunakan bilangan bulat, tetapi angka floating point dengan presisi tinggi (misalnya, 16 atau 32 bit). Ini menghilangkan batasan model RGB dan secara dramatis meningkatkan rentang dinamis gambar. Tetapi kemudian gambar HDR apa pun dapat ditampilkan pada media tampilan apa pun (monitor RGB yang sama), dengan kualitas setinggi mungkin untuk itu menggunakan algoritme khusus.

Render HDR memungkinkan Anda mengubah eksposur setelah kami merender gambar. Ini memungkinkan untuk mensimulasikan efek adaptasi penglihatan manusia (bergerak dari ruang terbuka terang ke kamar gelap dan sebaliknya), memungkinkan pencahayaan yang benar secara fisik, dan juga merupakan solusi terpadu untuk menerapkan efek pasca-pemrosesan (silau, suar, mekar, gerakan kabur). Algoritme pemrosesan gambar, koreksi warna, koreksi gamma, gerakan kabur, mekar, dan metode pasca-pemrosesan lainnya lebih baik dilakukan dalam representasi HDR.

Dalam aplikasi rendering 3D real-time (terutama game), rendering HDR mulai digunakan belum lama ini, karena memerlukan perhitungan dan dukungan untuk membuat target dalam format floating point, yang pertama kali tersedia hanya pada chip video dengan dukungan DirectX 9. Cara biasa rendering HDR dalam game: merender adegan ke buffer titik mengambang, pasca-pemrosesan gambar dalam rentang warna yang diperluas (mengubah kontras dan kecerahan, keseimbangan warna, efek silau dan blur, suar lensa, dan seperti), menerapkan pemetaan nada untuk menampilkan gambar HDR akhir ke perangkat tampilan LDR. Terkadang peta lingkungan digunakan dalam format HDR, untuk pemantulan statis pada objek, penggunaan HDR dalam mensimulasikan pembiasan dan pemantulan dinamis sangat menarik, untuk ini, peta dinamis dalam format titik mengambang juga dapat digunakan. Untuk ini, Anda dapat menambahkan lebih banyak peta ringan, dihitung sebelumnya dan disimpan dalam format HDR. Banyak hal di atas telah dilakukan, misalnya, di Half-Life 2: Lost Coast.

Rendering HDR sangat berguna untuk pasca-pemrosesan kompleks dengan kualitas lebih tinggi daripada metode konvensional. Mekar yang sama akan terlihat lebih realistis saat dihitung dalam model tampilan HDR. Misalnya, seperti yang dilakukan dalam game Far Cry Crytek, ia menggunakan teknik rendering HDR standar: menerapkan filter mekar yang disediakan oleh Kawase dan operator pemetaan nada Reinhard.

Sayangnya, dalam beberapa kasus, pengembang game dapat bersembunyi di bawah nama HDR hanya filter mekar yang dihitung dalam kisaran LDR biasa. Dan sementara banyak dari apa yang sedang dilakukan dalam game dengan rendering HDR saat ini adalah peningkatan kualitas yang lebih baik, manfaat rendering HDR tidak terbatas pada efek pasca ini, itu hanya yang termudah untuk dilakukan.

Contoh lain rendering HDR dalam aplikasi waktu nyata:


Pemetaan nada adalah proses mengubah rentang pencahayaan HDR ke rentang LDR yang ditampilkan oleh perangkat output seperti monitor atau printer, karena mengeluarkan gambar HDR ke sana akan memerlukan konversi rentang dinamis dan gamut model HDR ke dinamika LDR yang sesuai. rentang, paling umum RGB. Lagi pula, rentang kecerahan yang disajikan dalam HDR sangat luas, beberapa kali lipat dari rentang dinamis absolut pada satu waktu, dalam satu adegan. Dan jangkauan yang dapat direproduksi pada perangkat output konvensional (monitor, televisi) hanya sekitar dua kali lipat dari jangkauan dinamis.

Konversi HDR ke LDR disebut pemetaan nada, dan bersifat lossy serta meniru sifat-sifat penglihatan manusia. Algoritma ini biasanya disebut sebagai pernyataan pemetaan nada. Operator mengkategorikan semua nilai kecerahan gambar menjadi tiga jenis berbeda: gelap, sedang, dan cerah. Berdasarkan penilaian kecerahan nada tengah, iluminasi keseluruhan dikoreksi, nilai kecerahan piksel adegan didistribusikan kembali untuk memasuki rentang output, piksel gelap diringankan dan yang terang digelapkan. Kemudian, piksel paling terang dalam gambar diskalakan ke kisaran perangkat keluaran atau model tampilan keluaran. Gambar berikut menunjukkan konversi paling sederhana dari gambar HDR ke rentang LDR, transformasi linier, dan operator pemetaan nada yang lebih kompleks diterapkan pada fragmen di tengah, yang berfungsi seperti dijelaskan di atas:

Dapat dilihat bahwa hanya dengan penggunaan pemetaan nada nonlinier Anda dapat memperoleh detail maksimum pada gambar, dan jika Anda mengonversi HDR ke LDR secara linier, maka banyak hal kecil yang hilang begitu saja. Tidak ada algoritma pemetaan nada tunggal yang benar; ada beberapa operator yang memberikan hasil yang baik dalam situasi yang berbeda. Berikut adalah contoh bagus dari dua pernyataan pemetaan nada yang berbeda:

Bersama dengan rendering HDR, pemetaan nada baru-baru ini digunakan dalam game. Menjadi mungkin untuk secara opsional mensimulasikan sifat-sifat penglihatan manusia: kehilangan ketajaman dalam pemandangan gelap, adaptasi dengan kondisi pencahayaan baru selama transisi dari area yang sangat terang ke gelap dan sebaliknya, kepekaan terhadap perubahan kontras, warna ... Beginilah cara meniru kemampuan visi untuk beradaptasi di Far Cry sepertinya. Tangkapan layar pertama menunjukkan gambar yang dilihat pemain baru saja beralih dari ruangan gelap ke ruang terbuka yang terang benderang, dan yang kedua menunjukkan gambar yang sama beberapa detik setelah adaptasi.

bunga

Bloom adalah salah satu efek pasca-pemrosesan sinematik yang mencerahkan bagian paling terang dari sebuah gambar. Ini adalah efek cahaya yang sangat terang, yang memanifestasikan dirinya dalam bentuk cahaya di sekitar permukaan yang cerah, setelah menerapkan filter mekar, permukaan seperti itu tidak hanya menerima kecerahan tambahan, cahaya darinya (halo) sebagian mempengaruhi area gelap yang berdekatan. ke permukaan terang dalam bingkai. Cara termudah untuk menunjukkan ini adalah dengan contoh:

Dalam grafik 3D Bloom, filter dibuat menggunakan pasca-pemrosesan tambahan - mencampur bingkai yang diburamkan oleh filter buram (seluruh bingkai atau area terang individualnya, filter biasanya diterapkan beberapa kali) dan bingkai asli. Salah satu algoritma bloom post-filter yang paling umum digunakan dalam game dan aplikasi waktu nyata lainnya:

  • Adegan dirender menjadi framebuffer, intensitas cahaya objek ditulis ke saluran alfa buffer.
  • Framebuffer disalin ke tekstur khusus untuk diproses.
  • Resolusi tekstur berkurang, misalnya, dengan faktor 4.
  • Filter anti-aliasing (blur) diterapkan pada gambar beberapa kali, berdasarkan data intensitas yang direkam dalam saluran alfa.
  • Gambar yang dihasilkan dicampur dengan bingkai asli di framebuffer dan hasilnya ditampilkan di layar.

Seperti jenis pasca-pemrosesan lainnya, bloom paling baik digunakan saat merender dalam rentang dinamis tinggi (HDR). Contoh tambahan pemrosesan gambar akhir dengan filter mekar dari aplikasi 3D waktu nyata:

Gerakan kabur

Motion blur terjadi pada foto dan film karena pergerakan objek dalam bingkai selama waktu pencahayaan bingkai, saat rana lensa terbuka. Bingkai yang diambil oleh kamera (foto, film) tidak menunjukkan bidikan yang diambil secara instan dengan durasi nol. Karena keterbatasan teknologi, bingkai menunjukkan periode waktu tertentu, selama ini objek dalam bingkai dapat bergerak dengan jarak tertentu, dan jika ini terjadi, maka semua posisi objek yang bergerak selama rana terbuka lensa akan menjadi disajikan pada bingkai sebagai gambar buram di sepanjang vektor gerak ... Ini terjadi jika objek bergerak relatif terhadap kamera atau kamera relatif terhadap objek, dan jumlah blur memberi kita gambaran tentang besarnya kecepatan objek.

Dalam animasi tiga dimensi, pada saat tertentu dalam waktu (bingkai), objek terletak pada koordinat tertentu dalam ruang tiga dimensi, mirip dengan kamera virtual dengan kecepatan rana yang sangat cepat. Hasilnya, tidak ada blur seperti yang didapat kamera dan mata manusia saat melihat objek yang bergerak cepat. Itu terlihat tidak wajar dan tidak realistis. Pertimbangkan contoh sederhana: beberapa bola berputar di sekitar beberapa sumbu. Berikut adalah gambar bagaimana gerakan ini akan terlihat dengan dan tanpa blur:

Dari gambar tanpa pengaburan, seseorang bahkan tidak dapat mengetahui apakah bola itu bergerak atau tidak, sementara gerakan kabur memberikan gambaran yang jelas tentang kecepatan dan arah pergerakan benda. Omong-omong, kurangnya blur juga merupakan alasan mengapa gerakan dalam game pada 25-30 frame per detik tampak tersentak-sentak, meskipun film dan video terlihat bagus pada parameter frame rate yang sama. Untuk mengkompensasi kurangnya gerakan kabur, baik frame rate tinggi (60 frame per detik atau lebih tinggi) atau penggunaan metode pemrosesan gambar tambahan untuk meniru efek gerakan kabur diinginkan. Ini digunakan untuk meningkatkan kelancaran animasi dan untuk efek realisme fotografis dan sinematik secara bersamaan.

Algoritma blur paling sederhana untuk aplikasi real-time adalah dengan menggunakan data dari frame animasi sebelumnya untuk membuat frame saat ini. Tetapi ada juga metode blur gerakan yang lebih efisien dan modern, yang tidak menggunakan bingkai sebelumnya, tetapi didasarkan pada vektor gerakan objek dalam bingkai, juga menambahkan satu langkah pasca-pemrosesan lagi ke proses rendering. Efek blur dapat berupa layar penuh (biasanya dilakukan dalam pasca-pemrosesan), atau untuk objek individual yang bergerak paling cepat.

Kemungkinan penerapan efek buram gerakan dalam game: semua game balap (untuk menciptakan efek kecepatan gerakan yang sangat tinggi dan untuk digunakan saat menonton tayangan ulang seperti TV), permainan olahraga (pemutaran ulang yang sama, dan dalam gim itu sendiri, pengaburan dapat diterapkan pada objek yang bergerak sangat cepat, seperti bola atau keping), game pertarungan (gerakan cepat senjata jarak dekat, lengan dan kaki), banyak game lainnya (selama cutscene tiga dimensi dalam game pada mesin). Berikut adalah beberapa contoh efek posting blur dari game:

Kedalaman Lapangan (DOF)

Depth of field, singkatnya, adalah pengaburan objek tergantung pada posisinya relatif terhadap fokus kamera. Dalam kehidupan nyata, dalam foto dan film, kita melihat tidak semua objek sama jelas, ini disebabkan oleh kekhasan struktur mata dan struktur optik kamera dan kamera bioskop. Optik foto dan sinema memiliki jarak tertentu, objek yang terletak pada jarak seperti itu dari kamera berada dalam fokus dan terlihat tajam dalam gambar, dan objek yang lebih jauh dari kamera atau dekat terlihat, sebaliknya, buram, ketajaman berkurang secara bertahap dengan menambah atau mengurangi jarak ...

Seperti yang Anda tebak, ini adalah foto, bukan rendering. Dalam grafik komputer, setiap objek dari gambar yang diberikan sangat jelas, karena lensa dan optik tidak ditiru dalam perhitungan. Oleh karena itu, untuk mencapai realisme foto dan film, algoritma khusus harus digunakan untuk melakukan hal serupa untuk grafik komputer. Teknik-teknik ini mensimulasikan efek fokus yang berbeda pada objek pada jarak yang berbeda.

Salah satu teknik umum untuk rendering waktu nyata adalah memadukan bingkai asli dan versi buramnya (beberapa lintasan filter buram) berdasarkan data kedalaman untuk piksel dalam gambar. Dalam game, ada beberapa kegunaan efek DOF, misalnya video game di mesin game, replay di game olahraga dan balap. Contoh kedalaman bidang secara real time:

Tingkat Detail (LOD)

Tingkat detail dalam aplikasi 3D adalah metode untuk mengurangi kompleksitas rendering bingkai, mengurangi jumlah total poligon, tekstur, dan sumber daya lainnya dalam sebuah adegan, dan umumnya mengurangi kompleksitasnya. Contoh sederhana: model karakter utama terdiri dari 10.000 poligon. Dalam kasus di mana itu terletak dekat dengan kamera dalam adegan yang diproses, penting bahwa semua poligon digunakan, tetapi pada jarak yang sangat jauh dari kamera dalam gambar akhir, itu hanya akan memakan beberapa piksel, dan tidak ada titik dalam memproses semua 10.000 poligon. Mungkin, dalam hal ini, ratusan poligon, atau bahkan beberapa poligon dan tekstur yang disiapkan secara khusus akan cukup untuk tampilan model yang kira-kira sama. Dengan demikian, pada jarak menengah, masuk akal untuk menggunakan model yang terdiri dari lebih banyak segitiga daripada model paling sederhana dan kurang dari yang paling kompleks.

Metode LOD biasanya digunakan saat memodelkan dan merender adegan 3D, menggunakan beberapa tingkat kerumitan (geometris atau lainnya) untuk objek, sebanding dengan jarak dari objek tersebut ke kamera. Teknik ini sering digunakan oleh pengembang game untuk mengurangi jumlah poligon dalam sebuah adegan dan untuk meningkatkan kinerja. Saat ditempatkan dekat dengan kamera, model dengan detail maksimum (jumlah segitiga, ukuran tekstur, kompleksitas tekstur) digunakan, untuk kualitas gambar setinggi mungkin dan sebaliknya, saat model dikeluarkan dari kamera, model dengan lebih sedikit segitiga digunakan untuk meningkatkan kecepatan rendering. Mengubah kompleksitas, khususnya, jumlah segitiga dalam model, dapat terjadi secara otomatis berdasarkan satu model 3D dengan kompleksitas maksimum, atau mungkin berdasarkan beberapa model yang telah disiapkan sebelumnya dengan tingkat detail yang berbeda. Dengan menggunakan model dengan detail yang lebih sedikit untuk jarak yang berbeda, perkiraan kompleksitas rendering berkurang, dengan hampir tidak ada penurunan detail gambar secara keseluruhan.

Metode ini sangat efektif jika jumlah objek dalam pemandangan besar dan mereka berada pada jarak yang berbeda dari kamera. Misalnya, ambil permainan olahraga seperti hoki atau simulator sepak bola. Model karakter poli rendah digunakan saat jauh dari kamera, dan saat diperbesar, model digantikan oleh model lain dengan poligon dalam jumlah besar. Contoh ini sangat sederhana dan menunjukkan esensi metode berdasarkan dua tingkat detail model, tetapi tidak ada yang mengganggu untuk membuat beberapa tingkat detail sehingga efek perubahan tingkat LOD tidak terlalu terlihat, sehingga detail secara bertahap "tumbuh" saat objek mendekat.

Selain jarak dari kamera, faktor lain juga dapat menjadi penting untuk LOD - jumlah total objek di layar (ketika satu atau dua karakter ada dalam bingkai, maka model kompleks digunakan, dan ketika 10-20, mereka beralih ke yang lebih sederhana) atau jumlah bingkai per detik (batas nilai FPS ditetapkan, di mana tingkat detail berubah, misalnya, pada FPS di bawah 30 kami mengurangi kompleksitas model di layar, dan pada 60, sebaliknya, meningkat). Faktor lain yang mungkin mempengaruhi tingkat detail adalah kecepatan pergerakan objek (Anda tidak akan punya waktu untuk mempertimbangkan roket yang bergerak, tetapi Anda dapat dengan mudah melihat siput), pentingnya karakter dari sudut pandang permainan ( ambil sepak bola yang sama - untuk model pemain yang Anda kendalikan, Anda dapat menggunakan geometri dan tekstur yang lebih kompleks, Anda melihatnya paling dekat dan paling sering). Itu semua tergantung pada keinginan dan kemampuan developer tertentu. Hal utama adalah jangan berlebihan, perubahan yang sering dan mencolok pada tingkat detail mengganggu.

Izinkan saya mengingatkan Anda bahwa tingkat detail tidak selalu hanya terkait dengan geometri, metode ini juga dapat digunakan untuk menghemat sumber daya lain: saat membuat tekstur (walaupun chip video sudah menggunakan mipmapping, terkadang masuk akal untuk mengubah tekstur dengan cepat ke yang lain dengan detail berbeda), teknik pencahayaan (objek dekat diterangi menggunakan algoritme kompleks, dan objek jauh - menggunakan yang sederhana), teknik tekstur (pemetaan paralaks kompleks digunakan pada permukaan dekat, dan pemetaan normal digunakan pada permukaan jauh), dll. .

Tidak mudah untuk menunjukkan contoh dari permainan, di satu sisi, sampai batas tertentu LOD digunakan di hampir setiap permainan, di sisi lain, tidak selalu mungkin untuk menunjukkan ini dengan jelas, jika tidak, akan ada gunanya. dalam LOD itu sendiri.

Namun dalam contoh ini, masih jelas bahwa model mobil terdekat memiliki detail maksimum, dua atau tiga mobil berikutnya juga sangat dekat dengan level ini, dan semua yang jauh memiliki penyederhanaan yang terlihat, berikut adalah yang paling signifikan: ada tidak ada kaca spion, plat nomor, wiper kaca depan, dll. peralatan penerangan tambahan. Dan dari model terjauh bahkan tidak ada bayangan di jalan. Ini adalah tingkat detail algoritma dalam tindakan.

Penerangan global

Sulit untuk mensimulasikan pencahayaan realistis dari suatu pemandangan, setiap sinar cahaya dalam kenyataan berulang kali dipantulkan dan dibiaskan, jumlah pantulan ini tidak terbatas. Dan dalam rendering 3D, jumlah pantulan sangat bergantung pada kemampuan desain, perhitungan adegan apa pun adalah model fisik yang disederhanakan, dan gambar yang dihasilkan hanya mendekati realisme.

Algoritma pencahayaan dapat dibagi menjadi dua model: iluminasi langsung atau lokal dan iluminasi global (iluminasi langsung atau lokal dan iluminasi global). Model pencahayaan lokal menggunakan perhitungan iluminasi langsung, cahaya dari sumber cahaya hingga perpotongan pertama cahaya dengan permukaan buram, interaksi objek satu sama lain tidak diperhitungkan. Meskipun model seperti itu mencoba mengimbanginya dengan menambahkan pencahayaan latar belakang atau seragam (ambien), ini adalah perkiraan paling sederhana, pencahayaan yang sangat disederhanakan dari semua sinar tidak langsung dari sumber cahaya, yang menentukan warna dan intensitas pencahayaan objek tanpa kehadiran. dari sumber cahaya langsung.

Pelacakan sinar yang sama menghitung penerangan permukaan hanya dengan sinar langsung dari sumber cahaya dan permukaan apa pun, agar terlihat, harus langsung diterangi oleh sumber cahaya. Ini tidak cukup untuk mencapai hasil fotorealistik, selain iluminasi langsung, perlu memperhitungkan iluminasi sekunder oleh sinar yang dipantulkan dari permukaan lain. Di dunia nyata, sinar cahaya dipantulkan dari permukaan beberapa kali sampai benar-benar padam. Sinar matahari yang melewati jendela menerangi seluruh ruangan, meskipun sinar matahari tidak dapat langsung mencapai semua permukaan. Semakin terang sumber cahaya, semakin banyak waktu yang akan dipantulkan. Warna permukaan reflektif juga mempengaruhi warna cahaya yang dipantulkan, misalnya dinding merah akan menyebabkan bintik merah pada objek putih yang berdekatan. Berikut adalah perbedaan yang jelas, perhitungan tanpa dan dengan mempertimbangkan pencahayaan sekunder:

Dalam model iluminasi global, iluminasi global, iluminasi dihitung dengan mempertimbangkan pengaruh objek satu sama lain, beberapa pantulan dan pembiasan sinar cahaya dari permukaan objek, kaustik, dan hamburan bawah permukaan diperhitungkan. Model ini memungkinkan Anda untuk mendapatkan gambaran yang lebih realistis, tetapi memperumit prosesnya, membutuhkan lebih banyak sumber daya secara signifikan. Ada beberapa algoritma iluminasi global, kita akan melihat sekilas radiositas (perhitungan iluminasi tidak langsung) dan pemetaan foton (perhitungan iluminasi global berdasarkan peta foton yang telah dihitung sebelumnya menggunakan penelusuran). Ada juga metode yang disederhanakan untuk mensimulasikan pencahayaan tidak langsung, seperti mengubah kecerahan keseluruhan pemandangan tergantung pada jumlah dan kecerahan sumber cahaya di dalamnya, atau menggunakan sejumlah besar titik lampu yang ditempatkan di sekitar pemandangan untuk mensimulasikan cahaya yang dipantulkan, tetapi tetap saja ini jauh dari algoritma yang sebenarnya.GI.

Algoritma radiositas adalah proses menghitung pantulan sekunder sinar cahaya dari satu permukaan ke permukaan lain, serta dari lingkungan ke objek. Sinar dari sumber cahaya dilacak sampai kekuatannya turun di bawah tingkat tertentu atau sinar mencapai jumlah pantulan tertentu. Ini adalah teknik GI yang umum, perhitungan biasanya dilakukan sebelum rendering, dan hasil perhitungan dapat digunakan untuk rendering waktu nyata. Ide dasar radiositas didasarkan pada fisika perpindahan panas. Permukaan objek dibagi menjadi area kecil yang disebut patch, dan diasumsikan bahwa cahaya yang dipantulkan tersebar merata ke segala arah. Alih-alih menghitung setiap sinar untuk lampu, teknik rata-rata digunakan, membagi lampu menjadi tambalan berdasarkan tingkat energi yang mereka hasilkan. Energi ini didistribusikan secara proporsional di antara tambalan permukaan.

Metode lain untuk menghitung iluminasi global, yang diusulkan oleh Henrik Wann Jensen, adalah metode pemetaan foton. Pemetaan fotonik adalah algoritme iluminasi global penelusuran sinar lainnya yang digunakan untuk mensimulasikan bagaimana sinar cahaya berinteraksi dengan objek dalam suatu pemandangan. Algoritma menghitung refleksi sekunder sinar, pembiasan cahaya melalui permukaan transparan, refleksi tersebar. Metode ini terdiri dalam menghitung iluminasi titik-titik pada permukaan dalam dua lintasan. Yang pertama adalah penelusuran langsung sinar cahaya dengan refleksi sekunder, ini adalah proses awal yang dilakukan sebelum rendering utama. Metode ini menghitung energi foton yang pergi dari sumber cahaya ke objek di tempat kejadian. Ketika foton mencapai permukaan, titik persimpangan, arah, dan energi foton disimpan dalam cache yang disebut peta foton. Peta fotonik dapat disimpan ke disk untuk digunakan nanti sehingga tidak perlu dirender setiap frame. Pemantulan foton dihitung sampai usaha berhenti setelah sejumlah pemantulan tertentu atau ketika energi tertentu tercapai. Pada render pass kedua, iluminasi piksel pemandangan dengan sinar langsung dihitung, dengan mempertimbangkan data yang disimpan dalam peta foton, energi foton ditambahkan ke energi iluminasi langsung.

Perhitungan iluminasi global yang menggunakan sejumlah besar pantulan sekunder membutuhkan waktu lebih lama daripada kalkulasi iluminasi langsung. Ada teknik untuk perhitungan perangkat keras kota radio secara real time, yang menggunakan kemampuan generasi terbaru dari chip video yang dapat diprogram, tetapi untuk saat ini adegan di mana iluminasi global dihitung secara real time harus cukup sederhana dan banyak penyederhanaan. dibuat dalam algoritma.

Tetapi apa yang telah digunakan untuk waktu yang lama adalah penerangan global statis yang telah dihitung sebelumnya, yang dapat diterima untuk pemandangan tanpa mengubah posisi sumber cahaya dan objek besar yang sangat memengaruhi pencahayaan. Lagi pula, perhitungan iluminasi global tidak tergantung pada posisi pengamat, dan jika posisi objek tersebut di tempat kejadian dan parameter sumber iluminasi tidak berubah di tempat kejadian, maka nilai iluminasi yang dihitung sebelumnya dapat digunakan. Ini digunakan di banyak game, menyimpan data perhitungan GI dalam bentuk peta cahaya.

Ada juga algoritme yang dapat diterima untuk mensimulasikan iluminasi global dinamis. Misalnya, ada metode sederhana untuk digunakan dalam aplikasi waktu nyata untuk menghitung penerangan tidak langsung dari suatu objek dalam suatu pemandangan: rendering yang disederhanakan dari semua objek dengan detail yang dikurangi (kecuali untuk yang pencahayaannya dihitung) menjadi peta kubus resolusi rendah (juga dapat digunakan untuk menampilkan pantulan dinamis pada permukaan suatu objek), kemudian memfilter tekstur tersebut (beberapa lintasan filter blur), dan menerapkan data dari tekstur yang dihitung untuk menerangi objek ini sebagai melengkapi pencahayaan langsung. Dalam kasus di mana perhitungan dinamis terlalu berat, Anda bisa bertahan dengan peta radiositas statis. Contoh dari game MotoGP 2, yang dengan jelas menunjukkan efek menguntungkan dari tiruan GI yang begitu sederhana:



"itemprop =" gambar ">

"Apa itu shader?" Adalah pertanyaan yang sangat umum dari para pemain yang penasaran dan pengembang game pemula. Dalam artikel ini saya akan memberi tahu Anda tentang shader yang mengerikan ini dengan cara yang jelas dan dapat dimengerti.

Saya menganggap game komputer sebagai mesin kemajuan menuju gambar fotorealistik dalam grafik komputer, jadi mari kita bicara tentang apa "shader" dalam konteks video game.

Sebelum akselerator grafis pertama muncul, semua pekerjaan rendering bingkai video game dilakukan oleh prosesor pusat yang buruk.

Menggambar bingkai sebenarnya adalah pekerjaan yang cukup rutin: Anda perlu mengambil "geometri" - model poligonal (dunia, karakter, senjata, dll.) dan melakukan rasterisasi. Apa itu Rasterize? Seluruh model 3d terdiri dari segitiga terkecil, yang rasterizer berubah menjadi piksel (yaitu, "rasterize" berarti berubah menjadi piksel). Setelah rasterisasi, ambil data tekstur, parameter iluminasi, kabut, dll., dan hitung setiap piksel yang dihasilkan dari bingkai permainan, yang akan ditampilkan ke pemain.

Jadi, unit pemrosesan pusat (CPU - Central Processing Unit) terlalu pintar untuk membuatnya melakukan rutinitas seperti itu. Sebaliknya, adalah logis untuk mengalokasikan beberapa jenis modul perangkat keras yang menurunkan beban CPU sehingga dapat melakukan pekerjaan intelektual yang lebih penting.

Modul perangkat keras semacam itu adalah akselerator grafis atau kartu video (GPU - Graphics Processing Unit). Sekarang CPU menyiapkan data dan memuat rekan kerja dengan pekerjaan rutin. Mempertimbangkan bahwa GPU sekarang bukan hanya satu rekan, itu adalah kerumunan minion-core, maka ia mengatasi pekerjaan seperti itu sekaligus.

Tetapi kami belum menerima jawaban untuk pertanyaan utama: Apa itu shader? Tunggu, aku mulai ini.

Grafik yang bagus, menarik, dan dekat dengan foto-realisme, mengharuskan para pengembang kartu video untuk mengimplementasikan banyak algoritme di tingkat perangkat keras. Bayangan, lampu, sorotan, dan sebagainya. Pendekatan ini - dengan penerapan algoritme dalam perangkat keras disebut "Pipa atau pipa tetap" dan di mana grafik berkualitas tinggi diperlukan, itu tidak lagi ditemukan. Tempatnya diambil oleh Programmable Pipeline.

Permintaan pemain “Ayo, bawalah graphonium yang bagus! kejutan! ”, mendorong pengembang game (dan produsen kartu video, masing-masing) ke algoritma yang semakin kompleks. Sejauh ini, di beberapa titik, tidak ada cukup algoritma perangkat keras terprogram untuk mereka.

Sekarang saatnya kartu grafis menjadi lebih cerdas. Keputusan itu dibuat untuk memungkinkan pengembang memprogram blok GPU ke dalam saluran pipa sewenang-wenang yang menerapkan algoritme yang berbeda. Artinya, pengembang game, pemrogram grafis kini telah dapat menulis program untuk kartu video.

Dan sekarang, akhirnya, kita sampai pada jawaban atas pertanyaan utama kita.

"Apa itu shader?"

Shader (bahasa Inggris shader - shading program) adalah program untuk kartu video yang digunakan dalam grafik tiga dimensi untuk menentukan parameter akhir suatu objek atau gambar, dapat mencakup deskripsi penyerapan dan hamburan cahaya, pemetaan tekstur, refleksi dan pembiasan, bayangan, perpindahan permukaan, dll. banyak parameter lainnya.

Apa itu shader? Misalnya, Anda bisa mendapatkan efek ini, ini adalah shader air yang diterapkan pada bola.

Pipa grafis

Keuntungan dari pipeline yang dapat diprogram dibandingkan pendahulunya adalah bahwa sekarang programmer dapat membuat algoritme mereka sendiri, dan tidak menggunakan serangkaian opsi yang terprogram.

Pada awalnya, kartu video dilengkapi dengan beberapa prosesor khusus yang mendukung rangkaian instruksi yang berbeda. Shader dibagi menjadi tiga jenis, tergantung pada prosesor mana yang akan mengeksekusinya. Tetapi kemudian kartu video mulai dilengkapi dengan prosesor universal yang mendukung set instruksi untuk ketiga jenis shader. Pembagian shader ke dalam jenis telah dipertahankan untuk menggambarkan tujuan shader.

Selain tugas grafis dengan kartu video cerdas seperti itu, menjadi mungkin untuk melakukan perhitungan tujuan umum (tidak terkait dengan grafis komputer) pada GPU.

Untuk pertama kalinya, dukungan penuh untuk shader muncul di kartu video seri GeForce 3, tetapi awalnya diterapkan di GeForce256 (dalam bentuk Register Combiners).

Jenis bayangan

Tergantung pada tahap pipa, shader dibagi menjadi beberapa jenis: vertex, fragmen (piksel) dan geometris. Dan pada jenis pipeline terbaru juga terdapat tessellation shader. Kami tidak akan membahas pipa grafis secara rinci, saya masih berpikir untuk menulis artikel terpisah tentang ini, bagi mereka yang memutuskan untuk mempelajari shader dan pemrograman grafis. Tulis di komentar jika Anda tertarik, saya akan tahu apakah perlu membuang waktu.

Shader puncak

Vertex shader membuat animasi karakter, rumput, pohon, membuat gelombang di atas air dan banyak hal lainnya. Dalam shader simpul, programmer memiliki akses ke data yang terkait dengan simpul, misalnya: koordinat simpul dalam ruang, koordinat teksturnya, warnanya, dan vektor normal.

Shader geometris

Shader geometris mampu membuat geometri baru, dan dapat digunakan untuk membuat partikel, memodifikasi detail model dengan cepat, membuat siluet, dan banyak lagi. Berbeda dengan simpul sebelumnya, mereka tidak hanya dapat memproses satu simpul, tetapi juga seluruh primitif. Primitif dapat berupa segmen (dua simpul) dan segitiga (tiga simpul), dan jika ada informasi tentang simpul yang berdekatan (adjacency bahasa Inggris) untuk primitif segitiga, hingga enam simpul dapat diproses.

Shader piksel

Pixel shader melakukan pemetaan tekstur, pencahayaan, dan berbagai efek tekstur seperti refleksi, refraksi, kabut, Bump Mapping, dll. Pixel shader juga digunakan untuk efek pos.

Pixel shader bekerja dengan irisan dan tekstur bitmap - ini memproses data yang terkait dengan piksel (misalnya, warna, kedalaman, koordinat tekstur). Pixel shader digunakan pada tahap terakhir dari pipa grafis untuk membentuk sebuah fragmen dari suatu gambar.

Apa yang ditulis oleh shader?

Awalnya, shader dapat ditulis dalam bahasa seperti assembler, tetapi kemudian ada bahasa shader tingkat tinggi yang mirip dengan bahasa C, seperti Cg, GLSL dan HLSL.

Bahasa seperti itu jauh lebih sederhana daripada C, karena tugas yang diselesaikan dengan bantuan mereka jauh lebih sederhana. Sistem tipe dalam bahasa seperti itu mencerminkan kebutuhan pemrogram grafis. Oleh karena itu, mereka menyediakan programmer dengan tipe data khusus: matriks, sampler, vektor, dll.

RenderMan

Semua yang kami bahas di atas terkait dengan grafik waktu nyata. Tetapi ada grafik non-realtime. Apa bedanya - waktu nyata - waktu nyata, yaitu, di sini dan sekarang - untuk memberikan 60 frame per detik dalam permainan, ini adalah proses waktu nyata. Tetapi rendering bingkai kompleks untuk animasi canggih selama beberapa menit adalah non-realtime. Intinya tepat waktu.

Misalnya, kita tidak bisa mendapatkan grafis dengan kualitas seperti di film animasi terbaru dari studio Pixar secara real time. Peternakan render yang sangat besar menghitung simulasi cahaya menggunakan algoritma yang sama sekali berbeda, sangat mahal, tetapi memberikan gambar yang hampir fotorealistik.

Grafis super realistis di Sand piper

Misalnya, lihat kartun lucu ini, butiran pasir, bulu burung, ombak, semuanya terlihat sangat nyata.

* Video bisa di banned dari Youtube, jika tidak dibuka, google pixar sandpiper - kartun pendek tentang sandpiper pemberani sangat lucu dan lembut. Akan menyentuh dan mendemonstrasikan betapa kerennya grafik komputer.

Jadi ini RenderMan dari Pixar. Ini menjadi bahasa pemrograman shader pertama. RenderMan API adalah standar de facto untuk rendering profesional dan digunakan di semua pekerjaan Pixar dan seterusnya.

Informasi berguna

Sekarang Anda tahu apa itu shader, tetapi selain shader, ada topik lain yang sangat menarik dalam pengembangan game dan grafik komputer yang pasti akan menarik bagi Anda:

  • adalah teknik untuk menciptakan efek yang menakjubkan dalam video game modern. Artikel dan video ikhtisar dengan tutorial tentang cara membuat efek di Unity3d
  • - Jika Anda berpikir untuk mengembangkan video game sebagai karier profesional atau hobi, artikel ini berisi kumpulan rekomendasi yang bagus "dari mana harus memulai", "buku apa yang harus dibaca", dll.

Jika Anda memiliki pertanyaan

Seperti biasa, jika Anda masih memiliki pertanyaan, tanyakan di komentar, saya akan selalu menjawab. Untuk setiap kata atau koreksi kesalahan, saya akan sangat berterima kasih.

Instruksi ini akan membantu Anda memasang shader di Minecraft dan dengan demikian meningkatkan dunia game dengan menambahkan bayangan dinamis, kebisingan angin dan rumput, air realistis, dan banyak lagi.

Perlu segera dicatat bahwa shader memuat sistem dengan cukup berat, dan jika Anda memiliki kartu video yang lemah atau terintegrasi, kami sarankan untuk tidak memasang mod ini.

Instalasi terdiri dari dua tahap, pertama Anda perlu menginstal mod pada shader, dan kemudian shaderpack tambahan untuk itu

LANGKAH # 1 - Memasang mod untuk shader

  1. Unduh dan Instal Java
  2. Install OptiFine HD
    atau Shadersmod;
  3. Kami membongkar arsip yang dihasilkan ke tempat mana pun;
  4. Jalankan file jar, karena dia adalah seorang pemasang;
  5. Program akan menunjukkan jalan ke permainan, jika semuanya benar, klik Ya, Ok, Ok;
  6. Pergi ke .minecraft dan buat folder di sana shaderpack;
  7. Kami masuk ke peluncur dan melihat di baris profil baru dengan nama "ShadersMod", jika tidak, maka pilih secara manual.
  8. Selanjutnya, Anda perlu mengunduh shaderpacks

LANGKAH #2 - Memasang shaderpack

  1. Unduh shaderpack yang Anda minati (daftar di akhir artikel)
  2. Tekan tombol MENANG + R
  3. Pergi ke .minecraft / shaderpacks... Jika tidak ada folder seperti itu, buatlah.
  4. Pindahkan atau ekstrak arsip shader ke .minecraft / shaderpacks... Jalurnya akan terlihat seperti ini: .minecraft / shaderpacks / SHADER_FOLDER_NAME / shader / [. File fsh dan .vsh di dalam]
  5. Mulai Minecraft dan pergi Pengaturan> Shader... Di sini Anda akan melihat daftar shader yang tersedia. Pilih yang diperlukan
  6. Dalam pengaturan shader aktifkan "tweakBlockDamage", nonaktifkan "CloudShadow" dan "OldLighting"

Shader Luar Biasa Sonic Ether
Sildur "s shader
Chocapic13 "s Shaders
sensi277 "s yShaders
MrMeep_x3 "s Shaders
Naelego "s Cel Shaders
RRe36 "s Shaders
CUDA Shaders DeDelner
bruceatsr44 "s Acid Shaders
Beed28 "s Shaders
Paket Shader Ziipzaap
robobo1221 "s Shaders
dvv16 "s Shaders
Stazza85 super shader
hoo00 "s Shader pack B
Tanaman Melambai Regi24 "s
MrButternuss ShaderPack
Grafik Luar Biasa DethRaid di Nitro Shaders
Edi "s Shader ForALLPc" s
CrankerMan "s TME Shaders
Kadir Nck Shader (untuk skate702)
Werrus "s Shaders
Knewtonwako "s Life Nexus Shaders
paket shader CYBOX
CrapDeShoes CloudShade Alpha
AirLoocke42 Shader
CaptTatsu "s BSL Shaders
Triliton "s shader
ShadersMcOfficial "s Bloominx Shaders (Chocapic13" Shaders)
dotModded "s Continuum Shaders
Qwqx71 "s Lunar Shaders (shader chocapic13")

Dirancang untuk dieksekusi oleh prosesor kartu video (GPU). Shader dikompilasi dalam salah satu bahasa pemrograman khusus (lihat) dan dikompilasi menjadi instruksi untuk GPU.

Aplikasi

Sebelum penggunaan shader, generasi tekstur prosedural digunakan (misalnya, digunakan dalam game Unreal untuk membuat tekstur animasi air dan api) dan multitexturing (yang menjadi dasar bahasa shader yang digunakan dalam game Quake 3). Mekanisme ini tidak memberikan fleksibilitas yang sama seperti shader.

Dengan munculnya saluran grafik yang dapat dikonfigurasi ulang, menjadi mungkin untuk melakukan perhitungan matematis (GPGPU) pada GPU. Mekanisme GPGPU yang paling terkenal adalah nVidia CUDA, Microsoft DirectCompute, dan open source OpenCL.

Jenis bayangan

shader vertex

Shader simpul beroperasi pada data yang terkait dengan simpul polihedra, misalnya, dengan koordinat simpul (titik) dalam ruang, dengan koordinat tekstur, dengan warna simpul, dengan vektor tangen, dengan vektor binormal, dengan normal vektor. Sebuah vertex shader dapat digunakan untuk melihat dan mengubah perspektif vertex, menghasilkan koordinat tekstur, menghitung pencahayaan, dll.

Contoh kode untuk vertex shader dalam bahasa:

vs.2.0 dcl_position v0 dcl_texcoord v3 m4x4 oPos, v0, c0 mov oT0, v3

Shader geometris

Shader geometris, berbeda dengan shader simpul, mampu memproses tidak hanya satu simpul, tetapi juga seluruh primitif. Primitif dapat berupa segmen (dua simpul) dan segitiga (tiga simpul), dan jika ada informasi tentang simpul yang berdekatan (adjacency bahasa Inggris) untuk primitif segitiga, hingga enam simpul dapat diproses. Geometri shader mampu menghasilkan primitif dengan cepat (tanpa menggunakan prosesor pusat).

Shader geometri pertama kali digunakan pada kartu grafis seri Nvidia 8.

Pixel (fragmen) shader

Pixel shader bekerja dengan irisan dan tekstur bitmap - ini memproses data yang terkait dengan piksel (misalnya, warna, kedalaman, koordinat tekstur). Pixel shader digunakan pada tahap terakhir dari pipa grafis untuk membentuk sebuah fragmen dari suatu gambar.

Contoh kode untuk pixel shader dalam bahasa:

ps.1.4 teks r0, t0 mul r0, r0, v0

Keuntungan dan kerugian

Keuntungan:

  • kemampuan untuk menyusun algoritma apa pun (fleksibilitas, penyederhanaan, dan pengurangan biaya siklus pengembangan program, meningkatkan kompleksitas dan realisme adegan yang dirender);
  • peningkatan kecepatan eksekusi (dibandingkan dengan kecepatan eksekusi dari algoritma yang sama yang dieksekusi pada prosesor pusat).

Kekurangan:

  • kebutuhan untuk mempelajari bahasa pemrograman baru;
  • keberadaan set instruksi yang berbeda untuk GPU dari produsen yang berbeda.

Bahasa pemrograman

Sejumlah besar bahasa pemrograman shader telah dibuat untuk memenuhi kebutuhan pasar yang berbeda (grafik komputer memiliki banyak area aplikasi).

Biasanya, bahasa untuk menulis shader menyediakan programmer dengan tipe data khusus (matriks, sampler, vektor, dll.), Satu set variabel dan konstanta bawaan (untuk berinteraksi dengan fungsionalitas standar API 3D).

Render profesional

Berikut ini adalah bahasa pemrograman shader yang difokuskan untuk mencapai kualitas rendering yang maksimal. Dalam bahasa seperti itu, sifat-sifat bahan dijelaskan menggunakan abstraksi. Hal ini memungkinkan orang yang tidak memiliki keterampilan pemrograman khusus dan tidak mengetahui secara spesifik implementasi perangkat keras untuk menulis kode. Misalnya, seniman dapat menulis shader ini untuk memberikan "tampilan yang benar" (pemetaan tekstur, penempatan cahaya, dll.).

Biasanya, pemrosesan shader semacam itu membutuhkan banyak sumber daya: membuat gambar fotorealistik membutuhkan banyak daya komputasi. Biasanya, sebagian besar komputasi dilakukan oleh cluster komputer besar atau sistem blade.

RenderMan Bahasa pemrograman shader, diimplementasikan dalam perangkat lunak RenderMan Pixar, adalah bahasa pemrograman shader pertama. RenderMan API, dikembangkan oleh Rob Cook dan dijelaskan dalam Spesifikasi Antarmuka RenderMan, adalah standar de facto untuk rendering profesional, yang digunakan di seluruh pekerjaan Pixar. OSL OSL - ind. Open Shading Language adalah bahasa pemrograman shader yang dikembangkan oleh perusahaan Sony Pictures Imageworks dan bahasa yang menyerupai. Ini digunakan dalam program berpemilik "Arnold", yang dikembangkan oleh "Sony Pictures Imageworks" dan dimaksudkan untuk rendering, dan dalam program gratis Blender, yang dimaksudkan untuk membuat grafik komputer tiga dimensi. Render waktu nyata GLSL GLSL terbuka GL S hading L bahasa) adalah bahasa pemrograman shader yang dijelaskan dalam standar OpenGL dan berdasarkan versi bahasa yang dijelaskan dalam standar ANSI C. Bahasa ini mendukung sebagian besar fitur ANSI C, mendukung tipe data yang sering digunakan saat bekerja dengan grafik tiga dimensi (vektor, matriks). Kata "shader" dalam GLSL mengacu pada unit yang dikompilasi secara independen yang ditulis dalam bahasa ini. Kata "program" mengacu pada kumpulan shader yang dikompilasi yang dihubungkan bersama. Cg (eng. C untuk G rap) adalah bahasa pemrograman shader yang dikembangkan oleh nVidia bersama dengan Microsoft. Bahasa ini mirip dengan bahasa dan bahasa HLSL, yang dikembangkan oleh Microsoft dan termasuk dalam DirectX 9... Bahasa ini menggunakan tipe "int", "float", "half" (bilangan floating point 16 bit). Bahasa mendukung fungsi dan struktur. Bahasa ini memiliki pengoptimalan khusus dalam bentuk "array yang dikemas" (