Directx, ilk testler

Yavaş yavaş directx ile örnekleri incelemeye ve kendi çalışmalarımı yapmaya başladım.

Directx kullanırken aslında opengl i yanlış kullandığımı farkettim. Misal opengl de bir şekil çizerken

glVertex3f(…);
glVertex3f(…);
glVertex3f(…);

gibi 3 tane koordinat veriyordum. Bu fonksiyonlarda bu koordinatları ekran kartına yolluyor ve çizim işlemlerine başlıyordu. Her frame için tekrar tekrar yolladığımız için çok fazla yük biniyormuş.

Directx öğrenirken ise bu koordinatları (vertex leri diyeyim artık) bir vertex buffer ına bir kere yazıyoruz ve daha sonra bu buffer ı ekran kartı hafızasına kopyaladığımızı gördüm. Daha sonra istediğimiz zaman directx e “koordinatları bu bufferdan al artık” diyerek ekstra bir işlemci-ekran kartı arasında veri akışı olmadan çizimlerimizi yapabiliyorduk.

Yanlış hatırlamıyorsam opengl de de vardı böyle bir işlem (illa vardır yani =) ). Lakin bu özelliği kullanmayınca çok daha küçük polygon sayıları ile uğraşıyordum. Directx de ne kadar fazla polygon kullanabildiğimi görünce ufak bir şok yaşadım.

Bir örnek ile göstereyim. Aşağıda ki örnekte 512*512*2 yani yaklaşık 525 bin tane polygon var. Ve gayet akıcı bir şekilde çalışıyor.

test2test1

test3test4

Binary dosyalar
Kaynak Dosyalar

Shader değiştirmek için 1-9 tuşlarını kullanabilirsiniz.

Sol üst resim haritanın normal renkleri. Sağ üst resim ise siyah beyaz. Siyah beyaz olması için pixel shader kullandım. Kabaca pixel shader her pixel ekrana çizilirken ekran kartı üzerinde çalışan o pixelin rengini veren program(cık). Mesela ilk resim için pixel shader o an kullandığımız texture üzerinde gerçek rengi döndürürken, siyah beyaz yapabilmek için (r + g + b)/3 rengini döndürüyoruz. Pixel shader HLSL ile yazılıyor, ve .fx dosyaları içinde bulabilirsiniz.

Sol alt resim gene farklı bir pixel shader ürünü. O anki görüntünün emboss effect li halini veriyor. Son resim için durum biraz daha farklı. O post processing ile yapıldı (aslında hepsi post processing ile yapılı benim örneğimde ama son resim için post processing zorunlu =)). Postprocessing sahnenin ekrana değilde bir buffer a çizilmesi ve daha sonra bu buffer ekrana çizilirken pixel shader ile oynamalar yapılması işlemi. Burada da resmin x koordinatının sinüs üne göre y koordinatını hafif kaydırıyoruz ve böyle dalgalı bir görüntü elde etmiş oluyoruz.

Ayrıca dikkat ederseniz t3.x diye hayvani boyutta bir dosya var. Bu arazinin model dosyası. 3d max ile oluşturdum. İşleri baya basitleştiriyor, .x dosyasını yükledikten sonra tek bir fonksiyon çağırarak kendisini çizebiliyoruz. Lakin çizmek dışında pek bir işlemimiz yok tabi. Mesela collision detection yapabilmek için .x dosyasını yüklüyorum, daha sonra bunu tekrar normal ram e kopyalıyorum anca o zaman kullanabiliyorum =)

Bu ara pek haşır neşir olduğum siteler

http://www.directxtutorial.com/ başlangıç için harika bir kaynak
http://www.applicachia.com/ çok güzel örnekler var. Benim örnekte aslında buradakilerden bir tanesinin üzerinden gidiyor =D

ve google tabiki =)

Daha yazılacak çok şey var ama aklıma gelenler bunlar. Geliştirdikçe daha ayrıntı olarak anlatacağım umarım