> DirectX > Direct 3D’ ye Giriş – Bölüm 2

Direct 3D’ ye Giriş – Bölüm 2

Önceki makalede penceremizi oluşturmuştuk. şimdi bunu Direct3D ile nasıl ilişkilendireceğimizi göreceğiz. Bunu yapmak için gereken işleri 4 adım olarak kategorileyeceğiz. Tabi bu 4 adım, Direct3D’nin temelini oluşturduğundan, bir çırpıda anlatıp geçmeyeceğiz. Bu 4 adım, DirectX sürümlerine göre ufak tefek farklılık gösterebilir. Ama mantık aynıdır. şu an için biz DirectX 9’a göre bu işlemi gerçekleştirmeye çalışacağız.

İçindekiler

1. Giriş

2. Sihirli Dört Adım


2.1. Direct3D nesnesinin oluşturulması

2.2. Kartın Özelliklerinin Öğrenilmesi

2.3. Aygıt Parametrelerinin Belirlenmesi

2.4. Aygıt Nesnemizi Oluşturalım

3. Direct3D Render Hattı

3.1. Local Space, World Space ve View Space

3.2. Projection, Rasterization

4. Swapchain ve Page Flipping

5. D3DPRESENT_PARAMETERS Özellikleri

6. İlk Direct3D Programımız

1. Giriş

Elimizde şu an üzerine çizim yapmayı bekleyen bir pencere var. Ayrıca çizim işlemlerini yerine getirebilmek için gereken bir mesaj döngümüz de mevcut. Bu bölümde Direct3D’yi kullanıma hazırlayacağız. Verilecek kodları ezberlemeye uğraşmayın. Çünkü, ve ne yazık ki, DirectX’in hemen hemen her sürümünde initalize (hazırlık) kısımları değişmektedir. Bizim anlatacağımız 9.0 sürümüne göre olacak. Burada önemli olan işin gidişat yolu ve mantığıdır. Bunları anladıktan sonra hangi sürüm gelirse gelsin, geçiş yapmanız zor olmayacaktır.

Esas amacımız, Direct3D Device (aygıt) nesnesini oluşturmaktır. Çünkü bir çok iş bu nesne ile gerçekleştirilir. Bu aygıt nesnesini oluşturmak için gerekenleri, 4 adımda gerçekleştirmeye çalışalım.

2. Sihirli Dört Adım

2.1. Direct3D nesnesinin oluşturulması

Sistemde bulunan ekran kartının özellikleri öğrenmekle beraber, ekran kartı üzerinde işlem yapacağımız aygıt(device) nesnesini oluşturmak için bu nesneden faydalanıyoruz. Bunun için ilk adımımız bir Direct3D nesnesi oluşturmak olacaktır.



		

Bir interface’i kullanacağımız zaman mutlaka onun işaretçisini kullanıyoruz. Bunu eğer COM programlama ile uğraşmış iseniz bileceksiniz. DirectX, COM arayüzleri ile çalıştığından yavaş çalıştığı düşünülebilir. Fakat, düşünüldüğü gibi değildir. Yavaşlık sadece işlemlerin hazırlık safhalarında gerçekleşir. Ki bu da çoğu zaman fark edilmeyecek derecede küçüktür. Ayırca işlemlerinde Windows’u kullanmayıp, direk olarak donanımla iş yaptığından, DirectX nesneleri, normal COM arayüzlerinden çok daha hızlı çalışabilmektedir. Her neyse devam edelim.

Bir Direct3D nesnesini, IDirect3D9 arayüzü ile temsil ediyoruz. Arayüz isminin sonundaki rakam(9) versiyon numarasını göstermektedir. Nesnemizi oluşturabilmek için Direct3DCreate9 fonksiyonunu çağırıyoruz. Parametre olarak SDK’nın versiyonunu giriyoruz. Bu noktada dert edecek bir şey yok çünkü D3D_SDK_VERSION sabiti bizim için önceden tanımlanmıştır. Yani hangi versiyonda derlerseniz derleyin, o versiyonun SDK’da tanımlı sabitini kullanacaksınız.

2.2. Kartın Özelliklerinin Öğrenilmesi

Bu konu uzun bir meseledir. Burada sadece şuan için işimize yarayacak kısmı göstereceğiz. Daha fazlası için SDK yardım dosyalarına göz atabilirsiniz. şimdi aşağıdaki kodlara bir göz atalım:



		

Kısaca, burada yaptığımız işlem, ekran kartının T&L desteğinin olup olmadığıdır. Yani eğer kart Transform&Lighting özelliğin detekliyorsa, donanımsal Vertex işleme yapabiliyor demektir. Direct3D’nin ileriki konularında bu kısmın önemi anlyacaksınız.

Yukarıdaki kodda D3DCAPS9 ile ifade edilen yapının bir çok üyesi vardır. Bunları SDK yardım dosyasında bulabilirsiniz. Önceden oluşturduğumuz Direct3D nesnesini kullanarak kartın özelliklerini GetDeviceCaps metodu ile alıyoruz. İlk parametre, eğer sistemde birden fazla kart varsa kullanılacak olan parametredir. Biz genelde burayı varsayılan olarak bırakıyoruz. İkinci parametre ise aygıtı ne şekilde kullanacağımızı belirtiyor. Bu parametre HAL ve REF şeklinde iki değer alabilir. Ayrıntılı bilgi için ek bilgi kutusuna muracaat edebilirsiniz. En son paramterede ise çıktı alacağımız değişkeni referanslı olarak giriyoruz.

Ardından gelen işlemler kartın T&L desteğinin olup olmadığı ile ilgili kısımdır. Başka özellikleri aynı şekilde elde edebilirsiniz. BehaviourFlags değişkenini ileride kullanacağız. Burada vertex işlemenin donanımsal mı yoksa yazılımsal mı olacağını belirlememiz yeterlidir..

2.3. Aygıt Parametrelerinin Belirlenmesi



		

Aygıt nesnemizi oluşturabilmek için gereken bazı özellikleri Direct3D bilmesi gerekmektedir. Bu yüzden Direct3D nesnesine, oluşturacağımız aygıt nesnesinin özelliklerini D3DPRESENT_PARAMETERS yapısını kullanarak bildirmemiz gerekmektedir. Buradaki parametrelerin açıklamalarını aygıt nesnemizi oluşturduktan sonra yazmak istiyorum. Çünkü şimdi kafanız karışabilir. Buraya, daha doğrusu koda, ileride bir daha döneceğiz.

2.4. Aygıt Nesnemizi Oluşturalım

Bu işlemlerden sonra, esas amacımız olan şeyi yapacağız. Yani bütün çizim işlemlerinde kullanacağımız aygıt nesnesini oluşturacağız. Aşağıdaki koda bakalım:



		

Gördüğünüz gibi Direct3D nesnenmizin CreateDevice metodunu kullanarak yeni bir aygıt (Device) oluşturuyoruz. Önceden oluşturduğumuz BehaviourFlags ve aygıt parametrelerini de parametre olarak geçiriyoruz. En son parametre olarak da çıktı verilecek olan Device nesneinin referansını giriyoruz. Bu işlemlerden sonra eğer bir hata ile karşılaşmaz isek, aygıt (Device) nesnemiz oluşacaktır.

Evet artık bir şeyler çizmeye hazırız. Tabi öyle hemen kalkıp çizmeye başlamayacağız. İlk programımızı oluşturabilmemiz için bir kaç konuya daha el atmalıyız. İlk önce Direct3D nasıl çalışır onu görelim. Ardından bunlarla ilgili olarak yukarıda verdiğimiz D3DPRESENT_PARAMETERS yapısını inceleyelim. Buraya kadar yaptıklarımız karmaşık gibi görünse de, işin mantığını kaptıktan sonra zor gelmeyecek. İsterseniz bunları yazıp denedikten sonra biraz ara verip gözlerimizi dinlendirelim. Artık DirectX sularına girmiş bulunuyorsunuz. Hazır olduğunuzda ikinci sayfada buluşalım.

Sayfalar: 1 2 3

» Tags: , , , , , , , , , , ,

4 Comments

  • At 2007.10.28 18:59, emirhan göksu said:

    bu kodları nereye yazabiliriz

    • At 2007.10.28 19:01, emirhan göksu said:

      sorunu cevabını ne zaman alıcağız

      • At 2007.10.28 22:52, Fatih Tolga Ata said:

        Merhaba Emirhan,
        Bu kodları deneyebilmen için, bir C++ derleyicisi bulman gerekmekte. DirectX’in bu C++ derleyicisine tanıtılması işi bu makalenin konusu değil. İnternet üzerinde bununla ilgili kaynak bulabilirsiniz. Kolay gelsin.

        • At 2009.12.09 01:21, okan said:

          arkadaşım makalen süper memlekette c++ ile ilgili türkçe kaynak bulmak gerçekten zor Özellikle vc++ ama devamını getirirsen sevinirim..

          (Required)
          (Required, will not be published)