Plazma sayı 1, sayfa 52

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 52

struct VS_IN { float4 pos : POSITION0; float2 uv0 : TEXCOORD0; };

struct VS_OUT { float4 pos : POSITION0; float2 uv0 : TEXCOORD0; };

Aşağıda VS isimli vertex shader'ımıza bakalım. mul intrinsic (shader compiler'ına gömülü fonksiyonlardır) fonksiyondur. Matris çarpımlarında kullanılır. Shader'larda işlemler vektörel yapıldığından (x,y,z,w ya da r,g,b,a) komponentleri açıkça yazmanıza gerek yok. In.pos vertex buffer'dan gelen koordinat bilgilerini taşır ve her bir vertex'in koordinatları WorldViewProj matrisi ile çarpılır, clip space'deki konumları bulunur. Bu vertex shader'da gelen doku koordinatları üzerinde de modifikasyon yapıyoruz. Daha önce bahsettiğim nedenden dolayı offset değerlerini ekliyoruz.

VS_OUT VS(VS_IN In) { VS_OUT Out; Out.pos = mul(In.pos, mWorldViewProj);

//offset Out.uv0.x = In.uv0.x + 0.5 * (1.0/width); Out.uv0.y = In.uv0.y + 0.5 * (1.0/height);

return Out; }

Şimdi esas aksiyonun olduğu kısma geldik. PS fade in/out efektini gerçekleştiren piksel shader'ımız. Bu shader'da yapılan iş şu:

Color = Texture + (FadeColor - Texture) * t t uygulamadan ayarlanıyor (Herhalde bir timer class'ınız falan vardır ha? Ne bileyim işte t 5 saniye içerisinde 1'den 0'a ya da belki 0'dan 1'e gitsin tarzı şeyler programlamanız gerekecek de). t uniform değişken. 0'dan 1'e götürürsek fade out, 1'den 0'a götürürsek fade in efekti gerçekleşir. Shader'da tex2D intrinsic fonksiyonu ile texture'a erişip look up yapıyoruz. Görüldüğü gibi argüman olarak bir sampler ve texture koordinatlarını alıyor. Bu eriştiğimiz texture'ın göstermek istediğimiz sahnemiz olduğunu bir kere daha hatırlatayım. Fade color için ben bu shader'da beyaz rengini (istediğiniz rengi seçmekte serbestsiniz) seçtim ve float4(1.0,1.0,1.0,1.0) ile ayarladım. Bu vektörel bir veri tipi ve RGBA rengi temsil ediyor. C++ tipi bir constructor ile initialize ettim. Yukarıdaki interpolasyon eşitliğini lerp intrinsic fonksiyonu hesaplıyor. Son olarak piksel shader hesapladığı renk verisini ilgili register'a (COLOR0) yolluyor.

float4 PS(VS_OUT In):COLOR0 { float4 color = lerp(tex2D(s0,In.uv0), float4(1.0,1.0,1.0,1.0), t); return color; }

Aşağıdaki kısım ise hazırladığımız efektle ilgili bilgiler içeriyor. Uygulamadan bu efekte

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