Shader Nedir ?

Oyun Tasarımı

Shader Nedir ?

 Oyun tasarımında gün geçtikçe konuları biraz biraz ağırlaştırmaya ve oyun tasarımı ile ilgili oldukça bildiğim veya öğrendiğim bilgileri sizlere aktarmaya çalışıyorum ve son bir iki aydır daha doğrusu üniversitemdeki 2. sınıfın 1. döneminin oyun projesi dersinin finaline başladığım günden bu "shaders" yani "gölgelendiriciler" ile uğraşmaya başladım ve bu gün de sizlere shader (gölgelendirici) nedir gibi soruların cevaplarını vermeye çalışacağım. Biraz uzun bir yazı olabilir şimdiden uyarayım.

Pixel Nedir? Vertex?

Şimdi aşağıda shader nedir anlatırken kullanacağım 2 adet birim var pixel ve vertex ilk olarak bunların ne olduğunu anlatmak istiyorum çünkü sonra yazıyı okurken "bu ne anlatıyor?" demenizi istemem, gerçi bu yazıyı internette arayacak seviyedeyseniz pixel ve vertex in en azından pixel'in ne olduğunu biliyor ya da fikir sahibisinizdir.

Pixel Nedir?

Piksel, görüntünün dijital ortamda elde edilebilmesini sağlayan ve kontrol edilebilen en küçük birimdir.

Piksel nedir?

Yukarıdaki görseldeki her renk bir pikseli temsil ediyor diyebilirim.

Vertex Nedir?

Vertex 2 boyutlu veya 3 boyutlu boşluktaki(uzaydaki) bir noktayı temsil eden veri yapısıdır. 

Blender Vertex

Yukarıdaki görselde gördüğünüz karenin köşe noktaları 1 vertex i temsil eder.


Shader Nedir?

Shader programlanabilir ekran kartlarının (GPU) piyasaya girmesi ile hayatımıza giren ve ekran kartını vertex ve pixellere istediğimiz şekilde hükmetmesi için yazdığımız programlardır diyebilirim.

Şimdi shaderi bu şekilde tanımlayınca oldukça akıl karıştırıcı oldu ama sizlere şöyle biraz daha açıl halde anlatmaya çalışayım.

Shader dediğimiz şey ekran kartı için yazdığımız program / uygulamalardır diyelim. Bu yazdığımız uygulamalar bizlere oyunlardaki birbirinden güzel efektleri, dokuları oluşturmamızda işimize yaradığı gibi aynı zamanda oyunlarda deniz, lav gibi akışkan maddeleri de oluşturmamıza yarar. Birde bunların yanı sıra objeye gelen ışığın obje üzerinde nasıl bir gölgelendirme yapacağı ve renk ayarları gibi bir çok alanda kullanılabiliyor.

Unity üzerinden basit bir shader eğitimini buraya bırakıyorum, shader ile nasıl su yapılıyor Unity üzerinde görmeniz shaderin ne olduğunu anlamanızda faydalı olacağını düşünüyorum.




Render Pipeline / Graphics Pipeline

Konu konuyu açıyor resmen ama gölgelendiricileri kavramak için aslında bunların hepsinden biraz biraz bilmeniz gerekiyor.

İngilizcesi Render Pipeline veya Graphics Pipeline olan ve Türkçeye Çıktı Boru Hattı veya Grafik Boru Hattı olarak çevrilen 3 boyutlu bir görüntünün / 3 boyutlu ekranın 2 boyutlu ekrana / düzleme dönüştürmesi için hangi adımları gerçekleştirdiğini tanımlayan modeldir.

Açıkçası benim de Render Pipeline ın işleyişi ile ilgili çok fazla bir bilgim olduğunu söyleyemem ancak Unity üzerinde Standart Render Pipeline ı kullandığım zaman URP (Universal Render Pipeline) için yazdığım shader ın çalışmadığını biliyorum. 

Buraya hemen bir adet örnek Pipeline atayım.


Vulkan RP

Shader Tipleri

Pixel (Fragment) Shader (2D)

Sisteme gelen pixelin renk, transparanlık (alfa), derinlik (z-depth) gibi niteliklerini tutmaya ve işlemeye yarayan shader tipidir.
Tek bir pixelin verisini tuttuğu ve kontrol ettiğini için aslında çok büyük görsel efektler yapmanızı sağlamaz diyebilirim.
Aşağıdaki görselde ortada bulunan görsellerden yukarıdan 2. olan görsel pixel shaderin etki ettiği yerlere örnek olarak verilebilir.


Vertex Shader (3D)

Vertex Shader ise pixelin aksine Render Pipeline' ın kullandığı vertexleri tutmaya ve düzenlemeye yarar. Vertex konumu, rengi...
Oyunlardaki denizler, çimenlerin sallanması gibi bir çok şey Vertex Shader ile yapılır.
Yukarıdaki görselde ortada bulunan görsellerden en yukarıdaki 3 nokta vertex shaderin etki ettiği yere örnek gösterilebilir.

Shader Nasıl Yazılır ?

Shader dediğimiz şey yukarıdan hatırlarsanız programlanabilir grafik kartları için yazılan programcıklardı tabi ki bu programları yazmak için de belli başlı bir kaç şeye ihtiyacımız var. Aslında ihtiyacımız var demeyelim ama kullanacağınız yere göre değişiklikler gösteriyor yazım tarzımız desek daha doğru olur.
Shader yazmak için Graphics APIlerini yani hazır Grafik kütüphanelerini kullanırız.
Grafik kütüphanesinde bulunan belli başlı kod betikleri ile sanki normal bir kod yazıyormuş gibi (Tabi burada grafik kütüphanesinin syntaxına bağlı kalınması şartı var!) shader yazılabilir.

Shader yazmak için 
  • GLSL : C tabanlıdır, OpenGL destekler ve çapraz platform desteği bulunur.
  • HLSL : Directx tabanlıdır ve sadece Windows ortamında çalışır.
  • CG : Nvidia tarafından geliştirilmiştir HLSL ile aynı sayılır ancak çapraz platform desteği bulunur.

Gibi dilleri bilmeniz gerekiyor, bunlara ek olarak Unity üzerinde URP ile birlikte Shader Graph kullanarak da hiç kod yazmadan shader programları yazabilirsiniz.

Grafik Kütüphaneleri (Graphics APIleri)
  • Direct3D (DirectX)
  • Glide
  • Mantle (AMD)
  • Metal (Apple)
  • OpenGL
  • OpenGL ES
  • Vulkan
Daha bir çok grafik kütüphanesi bulunmaktadır..


Shader Örnekleri


Dissolve Shader

Çimen Shader