Opengl’den Directx’e geçiş dönemi

Gerçekten sancılı bir dönemmiş. Henüz directx e yeni başladım ve opengl den ne kadar çok farklı olduğu görülebiliyor.

En başta glut tarzı bir çok işi basitleştiren bir arayüzün (bir adı vardı ama unuttum şimdi) yokluğu hissettiriyor. Bir pencere açabilmek ve bunu opengl e bağlamak glut ile hazır fonksiyonlar ile yapılırken directx de her şeyi biz yapıyoruz. Tabi bu çok daha fazla esneklik sağlıyor ve daha iyi öğrenmemize yarıyor ama en basit uygulamalar için bile fazladan ~200 satır kod anlamına geliyor. Çoğunlukla copy paste olsa da okunabilirliği feci oranda düşürüyor. Aslında bir ara bunları basitleştirecek bir kütüphane yazmak geliyor içimden ama ondan önce öğrenecek çok şey var.

Bir diğer sıkıntı da opengl de tek bir fonksiyonla yaptığımız şeylerin directx de çok uzun sürmesi. Mesela glRotatef yerine şöyle bir şey diyoruz.

[code language='c++']

D3DXMATRIX matRotateY;
D3DXMatrixRotationY(&matRotateY, index);
d3ddev->SetTransform(D3DTS_WORLD, &(matRotateY));
[/code]

Bizleri düşünen birisi bunun için hazır bir kütüphane yazmış, çok hoş duruyor ama henüz kullanma fırsatım olmadı.

http://www.adamdawes.com/programming/windows/directx_matrixtransforms.html

Bir diğer zorluk da bana sanki directx için daha az kaynak var gibi geliyor. opengl de herhangibir konuda bir yığın örnek bulunabilirken directx’de bu durum daha sıkıntılı gibi.

Directx te şu an en çok ilgilendiğim konu shader lar. Basitçe tanımlamak gerekirse shader dediğimiz GPU üzerinde çalışabilecek programcının yazdığı uygulamalar. 3 çeşidi var: vertex shader, pixel shader ve geometry shader.

c++ dan farklı bir dil HLSL: ile yazılıyor. Açılımı High Level Shading Language ama gözüme o kadar da ‘high’ gelmedi. Ama bir diğer seçenek olarak assembly ile de yazılabiliyor ki buna göre tabi çok daha yüksek seviye kalıyor tabi =)

Şurada shader lar için basit bir kaç örnek var (ayrıca oyunu da oynayın muhteşem yapmış adam)

http://www.facewound.com/tutorials/shader1/

Öğrendikçe daha ayrıntılı bilgiler vermeye çalışacağım, kendime iyice kavramak için bir yaz süre vardım, fazla bir sayılır ama yazın sıcağında pek heves kalmıyor =)

Now you are thinking with portals

Stencil buffer’ın ne olduğunu öğrenmem ve sonrasında “Portal yapılır bunla” fikrinin gelmesi ile başlayan proje.

Portal nedir diyenler için herkesin denemesini tavsiye edeceğim Valve’nin ürettiği bir oyun. Amaç oluşturduğumuz portallar yardımıyla başlangıç noktasından bitiş noktasına gitmek.

Peki “portal” nedir derseniz, şöyleki: iki tane kapı hayal edin, birinden girdiğimiz de aslında diğerinden çıkıyoruz. Türkçe de kurt deliği diye kullanılıyor (hoş aslında oda wormhole ya neyse) diye düşünüyorum.

Yani bir ss ile anlatmak gerekirse:

port11portal21

Bu dikdörtgen pencere gibi duranlar portallarımız oluyor, pembe renkli şekil sarı duvardaki portalın önünde, dikkat ederseniz kırmızı duvardaki portaldan baktığımızda hemen önde onu görüyoruz.

Daha iyi anlamak için programı deneyin =)

İki sürümü var, hemen hemen aynı. Başta windows ta yazmıştım, daha sonra linux üzerinde test ettim.

Windows sürümü için glut isimli kütüphaneyi kullanmanız gerekiyor. Kendisinin asıl amacı opengl komutlarını bir parça basitleştirmek ve opengl i platformdan bağımsız olarak çalıştırmak. Ama klavye fonksiyonları çok zayıf olduğu için windows.h kütüphanesinden bir fonksiyon kullanmak zorunda kaldım. Bu yüzdende linux sürümünde glfw diye glut yerine başka bir kütüphane kullandım.

glut hakında bilgi için
http://www.opengl.org/resources/libraries/glut/
glfw hakkında bilgi için
http://glfw.sourceforge.net/

glut sürümünde linker a glut opengl ve glu kütüphanelerini vermelisiniz. glfw için biraz daha fazla şu kütüphaneler lazım olaca: glfw, GLU, GL, X11, pthread, Xxf86m, m, Xrandr. Ayrıcı -L ile şu klasörüde vermelisiniz: /usr/X11R6/lib

Programı yazarken hiç comment yapmamıştım =) Şu an biraz eklesem de hala kaynak kodu açık olmaktan çok uzak. Şu an saat sabah 7 ve uykusuzluk sayesinde hiç şevkim kalmadı doğrusu =D İlerde projeyi geliştirmeye başlarsam daha açık bir şekilde anlatmayı düşünüyorum.

Çalıştırabilir dosyalar

Windows
Linux

Kaynak kodları (windows visual c++ da hazırlandı, direk olarak dsp dosyasını açabilirsiniz. linux eclipse ile hazırlandı. c eklentisini kurduktan sonra workspace ine atın)

Windows

Linux