Anasayfa Eğitseller Oyun Yapımı DirectX Eğitselleri Bölüm 6 - Vertexlere Giriş - Nokta - Çizgi

DirectX Eğitselleri Bölüm 6 - Vertexlere Giriş - Nokta - Çizgi PDF Yazdır e-Posta
Kullanıcı Değerlendirmesi: / 3
ZayıfEn iyi 
Eğitseller - Oyun Yapımı
Salı, 19 Ağustos 2008 00:07

3b grafikte en basit geometrik obje vertex(köşe)'tir. Tüm geometrik şekiller vertexlerden oluşur. Direct3d bazında olaya baktığımızda en basit haliyle vertex konum bildiren bir veri yapısıdır. Fakat daha farklı gereksinimleri karşılamak için bir vertex konumdan başka renk, normal, uv vb. farklı değerlerde içerebilir. Directx'de ön tanımlı vertexler yoktur, biz kurallara uyarak istediğimiz formatta vertex'ler oluşturabiliriz. Bu eğitselimizde sadece konum içeren vertexler kullanarak noktalar , konum + renk bilgisi içeren vertexler ile çizgiler çizeceğiz.

#define NOKTALAR 1000 //nokta sayısı
#define CIZGILER 100 //cizgi sayısı * 2

Nokta ve çizgileri rastgele yerleştireceğiz ve burada nokta sayısını ve çizgi sayısının 2 katını tanımladık. Niye 2 katı derseniz bir çizgi 2 vertex'ten oluşur. Yani 50 çizgi çizilecek (99 tane çizme şansımızda var).

struct vertex3d
{
float x, y, z;
};

Normalde 3b çizimler için yukarıdaki biçimde bir vertex kullanırız, fakat 2b çizimler için transformed vertex denilen özel bir vertex kullanmamız gerekiyor. Bu vertexlerin özelliği hiç bir transformasyon ve ışıklandırma işlemine tabi tutulmamaları. Nokta vertex'imiz şu şekilde :

//nokta vertexi sadece 2d pozisyon
struct point_vertex
{
float x, y, z, rhw;
};
#define point_fvf D3DFVF_XYZRHW

Burada x ve y değerleri vertex'in konumunu belirtmek için yeterli. Z değerinin 0-1 arası olması gerekir ve buradaki Z değeri depth değeridir. RHW(reciprocal homogeneous w) değerinin çok spesifik kullanım yerleri vardır, şimdilik 1 vermek yeterli. Altta ise bir FVF(Flexible Vertex Format) tanımı var. Direct3d'de tanımlı olan bu değerlerin kombinasyonu ile kullanacağımız vertexin formatını tanımlamış oluruz. Burada sadece XYZRHW değeri var, buda vertex yapısı içerisindeki alt alanları doğru bir şekilde karşılıyor. Şimdide çizgi vertex'ine bakalım.

//çizgi vertexi 2d pozisyon + renk
struct line_vertex
{
float x, y, z, rhw;
DWORD color;
};
#define line_fvf (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)

Görüldüğü üzere bu vertex tanımında renk değeride tutuluyor. Bunun için bir DWORD(unsigned long) kullandık. FVF'mizi tanımlarken iki sabit arasında bit-bazında OR işlemi uygulanıyor. Burada önemli olan vertex yapısının içindeki değerler ile FVF sabitlerinin aynı sırada olmaları. Yani renk değerini ilk yazarsak DIFFUSE FVF sabitini ilk yazmamız gerekirdi. Şimdi koda devam edelim.

//tanımlar
Aygit* aygit;
point_vertex rasgele_noktalar[NOKTALAR];
line_vertex rasgele_cizgiler[CIZGILER];
bool linelist = true;
bool keydown = false;

Çizim işlemi yapmak için vertexlerimizi ardışık bir bellek bölgesine yerleştirmemiz gerekiyor. Burada sistem belleğini kullanıyoruz. Normalde direct3d bunları grafik kartının erişebileceği bir bellek konumuna yerleştirerek daha hızlı çizim yapmamıza olanak sağlayan sınıflar sunuyor(Bkz. vertex buffer) ama biz basitten başlıyoruz. "linelist" değişkenine sonra değineceğiz. Şimdi main metoduna bakalım :

int WINAPI WinMain(HINSTANCE hinstance,
HINSTANCE prevInstance,
PSTR cmdLine,
int showCmd)
{
srand(timeGetTime());

ilklemeler();
    aygit = new Aygit(hinstance,"BosPencere",false,800,600);
aygit->dongu(oyun_dongusu);
    return 0;
}

Evet gayet sade, gerekli ilklemeleri yapıp oyun döngüsü metoduna giriyoruz.

void ilklemeler()
{
//rasgele noktalar yerleştir
for (int i=0;i<NOKTALAR;i++)
{
rasgele_noktalar[i].x = (float)(rand() % 800);
rasgele_noktalar[i].y = (float)(rand() % 600);
rasgele_noktalar[i].z = 1;
rasgele_noktalar[i].rhw = 1;
}
    //rasgele çizgiler oluştur
for (int i=0;i<CIZGILER;i++)
{
rasgele_cizgiler[i].x = (float)(rand() % 800);
rasgele_cizgiler[i].y = (float)(rand() % 600);
rasgele_cizgiler[i].z = 1;
rasgele_cizgiler[i].rhw = 1;
rasgele_cizgiler[i].color = D3DCOLOR_XRGB(rand()%255,rand()%255,rand()%255);
}
}

Burada önce ekran sınırları içerisinde rastgele noktalar oluşturuyoruz. Daha sonrada rastgele çizgiler için vertexlere rastgele konumlar veriyoruz. Çizgi vertexlerinin renk değerleri için burada yardımcı bir makro kullandık. Bu makroya sırasıyla kırmızı, yeşil ve mavi değerlerini veriyoruz ve bize ona uygun DWORD değerini döndürüyor. Şimdi oyun döngüsünü inceleyelim:

void oyun_dongusu()
{
......
   //noktaları çiz
aygit->getDevice()->SetFVF(point_fvf); //vertex tipi
aygit->getDevice()->DrawPrimitiveUP(D3DPT_POINTLIST, //türü
NOKTALAR, //sayisi
rasgele_noktalar, //vertex bilgisi
sizeof(point_vertex)); //vertex boyutu
......

Çizim işleminin ilk aşaması çizilecek vertex'in türünü aygıta iletmek, bunuda setFVF metodu ile yapıyoruz. Daha sonra kullanıcı tanımlı bir bellek bölgesini kaynak göstererek çizim yapmamızı sağlayan DrawPrimitiveUP metodu ile noktaları çiziyoruz. Verilen parametreler gayet açık. İlk parametre çizilen geometrinin türü(burada nokta listesi), desteklenen türler şöyle :

-D3DPT_POINTLIST
-D3DPT_LINELIST
-D3DPT_LINESTRIP
-D3DPT_TRIANGLELIST
-D3DPT_TRIANGLESTRIP
-D3DPT_TRIANGLEFAN

Yeri geldikçe bunlara değineceğiz. Şimdi çizgi çizimine göz atalım :

//çizgileri çiz
if (linelist)
{
aygit->getDevice()->SetFVF(line_fvf); //vertex tipi
aygit->getDevice()->DrawPrimitiveUP(D3DPT_LINELIST, //türü
CIZGILER/2, //sayisi
rasgele_cizgiler, //vertex bilgisi
sizeof(line_vertex)); //vertex boyutu
}
else
{
aygit->getDevice()->SetFVF(line_fvf); //vertex tipi
aygit->getDevice()->DrawPrimitiveUP(D3DPT_LINESTRIP, //türü
CIZGILER-1, //sayisi
rasgele_cizgiler, //vertex bilgisi
sizeof(line_vertex)); //vertex boyutu
}

Yukarıdaki listede gördüğünüz üzere çizgiler için iki farklı yöntem var. Liste yönteminde bir çizgi çizmek için her zaman 2 vertex gerekiyor. Yani 100 vertex ile 50(CIZGILER/2) çizgi çizebilirsiniz. Strip yönteminde ise ilk konan vertex bir sonraki ile birleştiriliyor. Yani 100 vertex ile 99(CIZGILER-1) çizgi çizebilirsiniz. Programı çalıştırdığınızda ENTER'a basarak aradaki farkı daha iyi görebilirsiniz.

Kaynak Kodu İndir



-------- EKSTRALAR --------

Ekran Kartı Bilgisi Kodu:

http://directx.oyungelistirici.net/dx/onbilgi.rar

Kavramlar:
 
http://www.oyungelistirici.net/index.php/egitseller/14-oyunyapimi/233-kavramlar

DirectX Kaynakları:

http://www.chadvernon.com/blog/tutorials/
http://www.directxtutorial.com/
http://www.zanir.szm.sk/index.html
http://www.pieterg.com/
http://www.32bits.co.uk/
http://triplebuffer.devmaster.net/tutorials/archive/
http://www.two-kings.de/
http://www.mvps.org/directx/indexes/index.htm
http://www.drunkenhyena.com/cgi-bin/directx.pl

DirectX Kitapları:

http://www.amazon.com/ adresinde DirectX'i aratmanız yeterli.

-------- ÖNEMLİ --------

-Bu sitedeki dökümanlar Türkçe kaynak eksikliği yüzünden hazırlanmış ve ihtiyaç duyanların serbest kullanımına sunulmuştur.

-Sunulan kodlar ve bilgilerin doğruluk ve etkinlikleri konusunda bir garanti verilmemekle beraber her türlü talep ve düzeltmelerinizi mail yada ilgili forum başlığı yoluyla iletebilirsiniz

-Dökümanlarda daha çok genel kavramlara değinilmiş olup detaylı bilgi edinmek için directx dökümanını ve çeşitli kaynakları (özellikle kitap) okumanız tavsiye edilir. Farklı kaynakların bağlantılarını bu dökümanın sonunda bulabilirsiniz.

-Bu eğitsellerden verim alabilmek için orta düzeyde c++ bilgisi yeterlidir. Onun dışında winAPI hakkında bilgi sahibi olmak directx'i kavramakta size yardımcı olacaktır. Ayrıca eğitseller ardışık bağlantılı olduğu için bu işte yeni iseniz sırayla gitmeniz tavsiye edilir.

-Örnek kodlar Virusl Studio 2003 projeleridir, vs2005 ile de kullanılabilir.

-Kavramları Türkçeleştirmek için çok çaba sarfedilmemiştir, çoğu yerde İngilizce isimler kullanılmıştır. Merak ettikleriniz için kavram sözlüğüne bakabilirsiniz.

-İndireceğiniz yazılımlardan dolayı PC'nizin ya da bünyenizin zarar görmesi durumunda sorumluluk kabul etmeyiz, geçmiş olsuna gelebiliriz :)

-Yazılanların hakkı saklı değildir, sağda solda ben yaptım diye dağıtabilirsiniz :)
 
Yunus KARA
Son Güncelleme ( Salı, 19 Ağustos 2008 01:23 )
  Yorum yok.
Yorum ekle. (0 yorum)

 

OyunGelistirici.net - Türk Oyun Yapımcılarının Buluşma Noktası

Bu sitede yazılan tüm yazıların hakları yazarlarına aittir. İzin alınmadan yayınlanamaz.

Bu sitede Firefox kullanmanız önerilir. En az 1024 x 768 masaüstü çözünürlüğü tavsiye edilir.