Plazma sayı 1, sayfa 50

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 50

2) PBuffer (Pixel Buffer) yöntemi kullanılabilir. Bu yöntemde pencerenin kullandığının dışında farklı bir render context yaratılır ve sahne buraya çizdirilir. Sonra wglARBRenderTexture extension'ı kullanılarak bu render context'in içeriği texture olarak kullanılabilir. Pbuffer'ları kurmanın karmaşıklığı yüzünden ve de render context switching hakkındaki trickleri bilmiyorsanız ( her frame'de render context switching var : pbuffer --> window --> pbuffer... GeForce 3 , Radeon 8500 altı kartlarda sürünürsünüz) PBuffer ile render to texture'dan uzak durun. Pbuffer'lar başlı başına bir tutorial konusu olabilir. Bu yüzden burda kesiyorum.

3) EXT_framebuffer_object extension'ını kullanabilirsiniz. Gerek kullanım kolaylığı ve hız açısından en uygun yöntem bu bence. Fakat detaya girmiyorum. Bu da kendi içinde bir tutorial olabilir.

3) Pixel Shader Yöntemi :

Huh , şimdiden bayağı uzun bir tutorial oldu. Bu kısmı okuyacak arkadaşların direct3d ile tecrübesi olduğunu varsayıyorum. Yani en azından burada api detaylarına girmicem. Mesela texture nasıl yüklenir ya da .fx dosyaları nasıl hazırlanır gibi.. çünkü bunlar başka bir tutorial konusu olabilir. Shader'lar ile fazla haşır neşir olmamış scener'lar için bu shader konusuna çok kısa bir giriş yapalım. Demolar (ve bilgisayar oyunları) gerçek zamanlı bilgisayar grafikleri ile ilgili olduğundan , bizim shader diyince anlamamız gereken şey şu olmalı : 3D işhattını (pipeline) modifiye eden programlar. Bu programlar GPU üzerinde (vertex ve pixel processor'ler) çalışır. Günümüz GPU teknolojisinde pipeline'ın belli kısımları programlanabilir haldedir ve pipeline'ın kabaca iki ana hattan oluştuğunu söyleyebiliriz : Vertex hattı ve pixel hattı.

Yukarıda yazılanlara göre bazı tanımlar yapabiliriz:

Vertex Shader : Pipeline'a giren her vertex üzerinde çalışan programlardır. Vertex shader ile GPU'nun vertex processor denen donanım kısmı programlanır. Vertex shader'lar girdi olarak (dolayısıyla vertex processor) herhangi bir geometrik dönüşüme uğramamış vertex'ler (object space'de tanımlı) , bu vertex'lerle ilişkilendirilmiş renk , doku koordinatı , normal vektörleri vs.. gibi verileri alırlar. Çıktı olarak ise clip space'de vertex koordinatları (rasterizer'a gitmeden önce, vertex shader'dan sonra arada başka pipeline seviyeleri var , mesela backface culling ya da homojen divide gibi.. bunlar programlanamaz) ve rasterizer'ı besleyecek her türlü veriyi (modifiye ettikleri doku koordinatları , normaller vs..) verirler. Vertex shader'lar yeni vertex'ler üretemezler , var olan vertex'leri modifiye ederler.

Pixel Shader : Rasterizasyon sonucu oluşan her pixel üzerinde çalışan programlardır. Pixel shader ile pixel processor programlanır. Input olarak rasterizer'dan gelen verileri alırlar ve çıktı olarak da color ve depth buffer'a hesapladıkları piksel değerlerini yazabilirler. Piksel shader'dan sonra son pipeline seviyesi olan per fragment operations (yeni gelen piksel değerleri ile frame buffer'da yazılı olan piksel değerleri ile ilgili her türlü işlemin yapıldığı kısım.. depth test , alpha test , alpha blending fog vs..) gelir.

Esas konumuza geri dönersek. Fade In/out işlemi bir post processing işlemi. Yine sahnemizi bir texture'a çizdireceğiz ve bu texture'u alıp bir quad üzerine map edeceğiz. Pixel shader piksel değerlerine doğrudan erişemediği için texture lookup yapacağız. Bu yüzden her frame texture'a çizdiriliyor(Render to Texture). Tutorial yeterince uzadığından nasıl screen aligned quad çizilir ya da render to texture nasıl yapılır o konulara girmicem , sadece shader'lardan bahsedeceğim.

Fade In/Out için pixel shader'da lineer interpolasyon yapacağız. İlk anlattığım yönteme (Frame Buffer ile blending) dikkatle bakarsanız lineer interpolasyon formunda olduğunu görürsünüz. Bildiğimiz iki değer arasındaki değerleri bulmak için interpolasyon kullanırız. Şimdi lineer interpolasyonu bir anlayalım. Mesela x ekseninde, x1 koordinatından x2 koordinatına gideceğiz :

Klavyeyle gezinmek için ← ve → tuşları.