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ı.
Sayfa 53
FadeinOut ismi ile erişebiliriz. Tekniğin ismi FadeinOut ve tek pass'den oluşuyor. Ayrıca bazı render state'leri de bu teknik içerisinde ayarladım. (Tüm Direct3D state'lerine .fx dosyaları içerisinden erişip ayarlayabiliriz.). Son satırlar ise yazdığımız shader'ların shader compiler tarafından hangi shader profile'ına göre derleneceğini belirtiyor. Burada VS vertex shader 1.1'e göre, PS de piksel shader 1.1'e göre derleniyorlar.
technique FadeinOut { pass p0 { Lighting = FALSE; CullMode = NONE; VertexShader = compile vs_1_1 VS(); PixelShader = compile ps_1_1 PS(); } }
Huh, bu tutorial burada biter, scg de yatağa gider.
Not: tutorial ile ilgili her türlü sorun için (eksik, yanlış, anlaşılmayan yerler vs..) beni rahatsız etmeyin, forumları kullanın puhaaaaaa...
Sinan "scg" Çanga