Plazma sayı 1, sayfa 51

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 51

LERP = x1 + (x2 - x1) * t dediğimiz zaman x1 ve x2'nin arasındaki her değeri t'yi kullanarak bulabiliriz. t'nin izin verilen değer aralığı [0,1]'dir. t = 0 için x1 , t = 1 için x2'deyiz. Interpolasyon bilgisayar grafiklerinde, özellikle animasyonda çok kullanılan matematiksel bir araçtır. Lineer'in dışında çeşitli spline eğrileri kullanan interpolatörler de vardır.

Bizde pixel shader'da texture ile fade rengi arasında lerp işlemi uygulayacağız.

Not: Lineer interpolasyon lerp olarak da bilinir.

Daha önceden yazdığım .fx dosyasına bakalım ve en azından shader'lara bir parça kendimizi alıştıralım.

İlk olarak uniform değişkenler karşımıza çıkacak. Uniform değişkenler shader'ın etkilediği her piksel ya da vertex için aynı kalan değişkenlerdir. Mesela burada mWorldViewProjection, transformasyon matrisidir. (object space ----> clip space'e) Shader'ın etkilediği geometrideki her vertex için aynıdır. t ise lineer interpolasyonda kullanılan parametredir ve her piksel için aynıdır. width ve height vertex shader'da doku koordinatları için offset değerleri hesaplanmasında kullanılır. Çünkü Direct3D sampling kurallarına göre ekrandaki pikseller ile texture'daki texellerin 1:1 eşleşmesi için doku koordinatları (u,v) yerine: u+ = offset_u, ve v+ = offset_v olmalıdır.

offset_u = (1.0/2.0) * (1.0/width) // width : screen width offset_v = (1.0/2.0) * (1.0/height) // height : screen height

Esasında HLSL'de uniform keyword'ü uniform değişkenleri belirtmekte kullanılır. Fakat global değişkenlerde (shader kodları gövdelerinde olmayan değişkenler) buna gerek yok, global değişkenler uniformdur. Genelde uniform değişkenler uygulamadan shader'a gönderilen değişkenlerdir. Her vertex ya da her piksel için ayrıca hesaplanmazlar.

float4x4 mWorldViewProj; float t; float width, height;

.fx dosyalarının bir güzelliği de texture address ve filtreleme modlarının bu dosyalar içerisinde tanımlanabilmesidir. t0 pixel shader'ın kullanacağı texture'ı belirtir. s0 ise pixel shader'ın bizim texture'ımıza erişirken (look up için) kullandığı sampler'dır.

texture t0; sampler2D s0 = sampler_state { Texture = (t0); AddressU = CLAMP; AddressV = CLAMP; MagFilter = LINEAR; MinFilter = LINEAR; MipFilter = NONE; };

Bu kısımda ise piksel ve vertex shader'ların kullandığı veri yapılarını görüyoruz. C struct'larından pek bir farkı yok. Göze çarpan tek fark değişken isimleri yanındaki kolonlar ve bazı keyword'ler. Bu keyword'lere semantics denir ve görevleri ise pipeline'dan gelen verilerle ilgili GPU register'larını birbirlerine eşlemektir. VS_IN struct'ına bakarsak pos değişkeni homojen koordinatlarda (x,y,z,w) bir noktayı temsil eder ve vertex processor'un input register'larına (position register'ı, v0) alınacağı POSITION0 semantic'i ile belirtilir. VS_OUT'a da baktığınızda pos değişkeni, vertex shader'da transform edilmiş bir noktayı temsil eder ve vertex processor'un output register'ına (output position register'ı, oPos) alınacağı yine POSITION0 semantic'i ile belirtilir. HLSL'de input ve output register'larının aynı semantic'lerle belirtildiğini görebilirsiniz.

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