Anasayfa Eğitseller Programlama Shader Eğitselleri 0 - Genel bakış

Shader Eğitselleri 0 - Genel bakış PDF Yazdır e-Posta
Kullanıcı Değerlendirmesi: / 2
ZayıfEn iyi 
Eğitseller - Programlama
Cuma, 09 Mayıs 2008 16:58

Shader Nedir, Ne işe yarar?

Bilgisayarlarda 3D devri ilk başladığı zamanlarda transformasyon ve ışıklandırma işlemleri işlemci tarafından hesaplanıyordu. Daha sonra işlemcinin bu konuda yavaş kaldığı ve bu işi yapan özel donanımların olması gerektiği düşüncesiyle bu işlemlerin yükü ekran kartına aktarıldı. Evet işlemler çok daha hızlı yapılıyordu fakat, donanım tarafından yapıldıkları için farklı yöntemlerle farklı sonuçlar alınması bir sorundu. DirectX 8.0’a kadar da bu böyle devam etti. DirectX 8’de ilk defa shader teknolojisini geliştirdiler. Artık Shader denilen ve ekran kartında çalışan küçük programcıklar sayesinde farklı transformasyon ve ışıklandırma yöntemleri kullanılabilir hale geldi. Bu küçük programcıklar sayesinde farklı ışıklandırma modelleri, gölgeler, tanecik efektleri ve benzeri yöntemlerin ekran kartında hızlı bir şekilde yapılması sağlanmıştır.

 

Peki nedir bu transformasyon ve ışıklandırma?

Transformasyon: herhangi bir koordinat sistemindeki vertexlerin farklı bir koordinat sistemindeki konumlarını hesaplama işlemine transformasyon denir.

 

3 Boyutlu modeller, dosyalarda model uzayı(model-space) denilen bir koordinat sisteminde tutulur. Modeli oluşturan vertexler önce modelin sahnemizdeki konumuna göre model uzayından sahne uzayına(world-space), daha sonra kameramızın sahnemizdeki konumuna göre sahne uzayından kamera uzayına(view-space) en son olarakta kameramızın projeksiyon bilgilerine göre kamera uzayından ekran uzayına transformasyonu yapılır. Modelin sahnedeki konumu, kameranın sahnedeki konumu ve kameranın projeksiyon ayarları aslında birer matristir ve transformasyon işlemi sadece bir vektör X matris çarpımından ibarettir. DirectX, OpenGL gibi grafik API’lerinde çoğu zaman bu matrisleri programcı ayrı ayrı verir, fakat bu API’ler kendi içlerinde bu matrisleri sırasıyla çarpıp model uzayından ekran uzayına transformasyonu sağlayan tek bir matris oluştururlar. Bu matris ekran kartında modeli oluşturan vertexlerle çarpılarak vertexlerin ekranda ki konumları tek çarpma işlemiyle hesaplanır. Bu işleme transformasyon denir.

 

Işıklandırma: Işıklandırma işleminde ise vertex normalleri, modelin materiyal bilgileri, ışığın cinsi gibi parametrelere bağlı olarak her vertexin ne kadar ışık alması gerektiği hesaplanmaktadır.

 

Bu ışıklandırma ve transformasyon işlerinin donanımda hangi sırada nasıl yapıldığını görmek için donanımın nasıl çalıştığını incelemek gerekmektedir.


Fixed Function Pipeline

 

 

Model bilgisi, vertexler ve vertexlerden oluşan primitiflerin (üçgen yada doğru gibi) bilgileri hafızada bufferlarda tutulur. İlk aşama olan Tesselation kısmında bufferlardan okunan bu bilgiler, bazı DirectX durum değişkenlerine göre yeniden düzenlenerek yeni primitifler oluşturulur.(üçgenlerin sıklaştırılması için kullanılır). Bu özellik genellikle kötü sonuçlar oluşturduğu için pek kullanılmaz. Bu yüzden detaylarına fazla girmeyeceğim. Bu aşamada herhangi bir işlem yapılmadan vertex ve primitif bilgilerinin 2. aşamaya geçtiğini varsayarak devam edeceğiz. 2. aşama olan Vertex İşleme kısmında transformasyon ve ışıklandırma işlemleri yapılır. Modelde bulunan her vertex ekran uzayına transform edilirerek, ışık şiddeti, kullanılacak dokunun koordinatları(UV koordinatları) gibi bilgiler hesaplanır. Bu aşama sonucunda ekran uzayına gelmiş olan bütün vertexler 3. aşama olan Geometri İşleme kısmında daha fazla hesaplama yapmamak amacıyla clipping denilen bir işlemle ekran dışında kalan vertexler atılır. Clippingden sonra ekranda görüneceği kesinleşmiş üçgen yada doğru gibi her bir primitif için, primitifi oluşturan piksellerin pozisyonları hesaplanır(Rasterization).

Daha önceki aşamalarda her vertex için hesaplanan ışık şiddeti ve UV koordinatları gibi değerler, piksellerin prmitifi oluşturan köşelere olan uzaklıklarına göre interpole edilip her piksel için kullanılması gereken değerler hesaplanır.(Interpolation). Bu değerler bir sonraki aşama olan Piksel İşleme kısmında kullanılarak her piksel için yeni bir renk değeri hesaplanır. Son aşama olan Rendering kısmında da yine DirectX durum değişkenlerine göre derinlik kontrolü, ve saydamlık gibi diğer görsel efektleri sağlamak için blending gibi işlemler yapıldıktan sonra oluşan renk back-buffer’a yazılır.

 

Fixed Function’ın az çok nasıl çalıştığını anladığımıza göre shader’ların bu pipeline’da hangi aşamaların yerlerini aldıklarını inceleyebiliriz. Vertex Shader’lar fixed function pipeline’da ekran kartı tarafından yapılan Vertex İşleme aşamasının, Pixel Shader’lar da Piksel İşleme aşamasının yerini alırlar. Bu yüzden bu aşamalarda fixed function’da yapılan herşey shader’lara kalmıştır.

 

Shaderların girdi ve çıktılarını inceleyecek olursak, Vertex Shader’ın girdileri yine model bilgileridir(pozisyon, normal gibi) çıktılarında ise zorunlu olarak bir tek o vertexin ekran uzayındaki pozisyonu vardır. Opsiyonel olarak da herhangi bi amaç için (UV koordinatları yada ışık şiddeti gibi) sınırlı sayıda çıktı değerleri kullanılabilir. Bu değerler yine Geometri İşleme kısmında interpole edilip aynı sırada piksel shadera girdi olarak verilir. Piksel Shader’ın çıktısı da o piksel için hesaplanan renk değeridir (opsiyonel olarak renk değerine ek olarak o pikselin derinlik değeri de piksel shader’ın çıktısı olarak verilebilir).


Interpolasyon:

 

İnterpolasyonun ne olduğunu nasıl hesaplandığını anlamak için şekiller üzerinde önce bir doğru üzerinde düşünüp daha sonra üçgende nasıl yapıldığını göreceğiz.

 

0 ile 1 arasındaki her t değeri için X1(kırmızı) ve X2(mavi) değerleri arasında bir değeri hesaplamak iyoruz.

 


t noktası kırmızıdan ne kadar uzaksa o kadar mavi, maviden ne kadar uzaksa o kadar kırmızı olması gerekiyor. Bu durumda:

 

mavi % = mavi doğru parçasının uzunluğu / doğrunun uzunluğu

kırmızı % = kırmızı doğru parçasının uzunluğu / doğrunun uzunluğu

 

t’deki değer=(mavi%)*mavideki değer+(kırmızı%)*kırmızıdaki değer

 

mavi%= t ve kırmızı%= 1-t olduğuna göre:

t deki değer = tX1 + (1-t)X2

(Linear Interpolation)

 

Doğrularda uzunluk karşılaştırması yaparak interpolasyon yapabiliyoruz. Peki üçgenlerde nasıl bir karşılaştırma yapabiliriz?

 

p noktası için üç köşeye olan uzaklıklarıyla orantılı yeni bir değer hesaplamak istiyoruz. Şekilde de görüldüğü gibi p noktası kırmızı noktaya yaklaştıkça altında oluşan üçgenin alanı büyüyor. Bu sebeple üçgenlerde alan karşılaştırması yapabiliriz.

A1 + A2 + A3 = A

kırmızı% = A1 / A

yeşil% = A2 / A

mavi% = A3 / A

olduğuna göre,

 

p’deki değer = (A1X1+A2X2+A3X3)/A

 

A1/A = s

A2/A = t için;

 

p’deki değer = sX1 + tX2+(1-s-t)X3

(Barycentric Interpolation)

 

 

Programable Pipeline Örneği

Son Güncelleme ( Çarşamba, 14 Mayıs 2008 21:49 )
 
Yorum ekle (2 yorum)
Shader Eğitselleri 0 - Genel bakış
May 14 2008 19:32:04
Bu Başlık, İçerik Tartışmasıdır: Shader Eğitselleri 0 - Genel bakış

Shader Eğitsel Serisinin ilk bölümü. Uzun bir süre önce hazırlamıştım diğerleri bitince hepsini aynı anda yayınlayacaktım fakat devamını getirmek için vaktim olmadı. Vaktim olduğunda devamını getireceğim
#7348
Shader Eğitselleri 0 - Genel bakış
Aug 13 2008 14:06:31
Gercekten basarili bir yazi olmus, grafikler ve yazi cok guzel bir uyum saglanmis. tebrik ederim-
#8127

Yorum ekle. (2 yorum)

 

OyunGelistirici.net - Türk Oyun Yapımcılarının Buluşma Noktası

Bu sitede yazılan tüm yazıların hakları yazarlarına aittir. İzin alınmadan yayınlanamaz.

Bu sitede Firefox kullanmanız önerilir. En az 1024 x 768 masaüstü çözünürlüğü tavsiye edilir.