30 Nisan 2009 Perşembe

OpenGL'de Push ve Pop Matrix


OpenGL kullanılarak geliştirilen bir örnek incelediğinizde glPushMatrix() ve glPopMatrix() komutlarıyla karşılaşmışsınızdır. Daha sonra bunun çok da önemli olmadığını düşünmüş olabilirsiniz, ancak bu komutları kullanmanız işinizi kolaylaştırabilir. Şimdi size kısa bir biçimde bu komutları ne işe yaradığını anlatacağım.

OpenGL ile ilgili kod yazmaya başladığımızda genellikle glLoadIdentity() fonksiyonunu çağırarak birim matrisimizi -diagonal elemanları 1, diğer elemanları 0 olan, 4x4lük matris- yükleriz. Daha sonra çizilecek poligonların, bulundukları yere çizmek için glTranslate, glRotatef gibi fonksiyonları kullanarak istediğimiz yere çizilmesini sağlarız. Örnek olarak bir arabanın gövde ve 4 tekerden oluştuğunu varsayalım. Bu arabayı çizmek için push ve pop matrix fonksiyonlarını kullanmazsak, aşağıdaki şekilde yazmamız gerekir.

glLoadIdentity();
glTranslatef( [Aracın Posizyon Vektörü] );
[Aracın Gövdesini Çizdir]

glLoadIdentity();
glTranslatef( [Aracın Posizyon Vektörü] );
glTranslatef( [Ön Tekerleğin Pozisyon Vektörü] );
[Ön Tekerleği Çizdir]

glLoadIdentity();
glTranslatef( [Aracın Posizyon Vektörü] );
glTranslatef( [Arka Tekerleğin Pozisyon Vektörü] );
[Arka Tekerleği Çizdir]

...

Eğer glPushMatrix() ve glPopMatrix fonksiyonlarını kullanırsak, aynı örnek aşağıdaki hali alır.

glPushMatrix();
  glTranslatef( [Aracın Posizyon Vektörü] );
  glPushMatrix();
    glTranslatef( [Ön Tekerleğin Pozisyon Vektörü] );
    [Ön Tekerleği Çizdir]
  glPopMatrix();
  glPushMatrix();
    glTranslatef( [Arka Tekerleğin Pozisyon Vektörü] );
    [Arka Tekerleği Çizdir]
  glPopMatrix();

  [Aracın Gövdesini Çizdir]
glPopMatrix();

28 Nisan 2009 Salı

Shadow Physics



Bağımsız oyun geliştiricileri konferansında (Indie Developers Conference) gösterilen deneysel, gerçekten güzel bir çalışma :) Oyunda ışık kaynağını hareket ettiriyoruz, böylece oluşan gölgeler üzerinde karakterimizi belli bir yere götürerek bölümleri geçiyoruz.
Kaynak: http://www.indiegamepod.com/2009/04/video-podcast-interview-experimental.html

OpenGL'de Hataları Bulmak


OpenGL ile yazdığınız bir programı çalıştırıken beklenmedik sonuçlar alıyorsanız, büyük ihtimalle kodunuzda hata vardır.

Yanlış zamanda ya da yanlış sırada çağırılan openGL fonksiyonları derleme zamanında herhangi bir hata vermediği gibi çalışma anında da herhangi bir mesaj vermez, siz istemedikçe.

Peki bu hataları nasıl görüntüleyebiliriz ? Bunun için openGL'in içinde glGetError() isimli bir fonksiyon bulunmakta.

- GLenum glGetError();

Bu fonksiyonu ilk çağırdığınızda, programın başlangıcından itibaren oluşan ilk hatayı döndürür. Daha sonraki çağırışlarınızda ise bir önceki çağrılmadan sonraki hatayı döndürür.
  • GL_NO_ERROR -> Herhangi bir hata yok ise döndürülecek olan değerdir.
  • GL_INVALID_ENUM -> Eğer bir fonksiyonun kabul edemeyeceği bir enum değeri parametre olarak verildiyse, bu hata mesajı oluşturulur.
  • GL_INVALID_VALUE -> Belirtilen aralık dışındaki sayısal bir değer parametre olarak verilirse, bu hata mesajı oluşturulur.
  • GL_INVALID_OPERATION -> Fonksiyonlara verilen parametreler beraber çalışamıyorsa, bu hata mesajı oluşturulur.
  • GL_STACK_OVERFLOW -> OpenGL'deki stacklerin(yığın) alabileceğinden daha fazla değer verilirse, bu hata mesajı oluşturulur.
  • GL_STACK_UNDERFLOW -> Genel olarak glPopMatrix fonksiyonunun glPushMatrix den fazla çağırılmasıyla oluşur. Yani matris yığınlarından, yığında olduğundan fazla matris çıkarılmaya çalışılırsa, bu hata mesajı oluşur.
  • GL_OUT_OF_MEMORY -> Yapılan işlem sistemin hafızasının bitmesine neden oluyorsa, bu hata mesajı oluşturulur.

27 Nisan 2009 Pazartesi

WGL Temelleri

Eğer daha önce windows üzerinde opengl ile ilgili bir uygulama geliştirdiyseniz, opengl ile ilgili kod yazmadan önce bir pencere yaratmışsınızdır.

Örnek ya da deneme uygulamaları için glut yeterli olsa da daha ileri projeleriniz için win32 api'sini kullanmanız gerekebilir (nehe'in opengl tutorial'larında bulabilirsiniz.). Eğer tutoriallarda pencere oluşturan kodlarda dikkat ederseniz WGL kullanıldığını görürsünüz. Peki nedir bu WGL?

WGL, windows'ta openGL kullanmak için yararlandığımız api'lere denir. Okunuşu "wiggle" olarak yapılır.

WGL, rendering context oluşturmak, seçmek, openGL uygulamalarında windows font desteğini kullanmak ve openGL extension'larını yüklemek için kullanılır.

Rendering context, openGL'in istediğimiz pencerede çalışması için gerekli tüm bilgiyi içerir. Aynı zamanda çalışan birden fazla openGL uygulamasının birbirini etkilemesiniz önler.

Birden fazla pencere yada viewport barındıran uygulamalarda için birden fazla rendering context oluşturulabilir.

WGL kullanmak için gereken fonksiyonlar;
- HGLRC wglCreateContext(HDC hDC) -> bir rendering context oluşturmanızı sağlar.
- BOOL wglDeleteContext(HGLRC hRC) -> oluşturduğunuz rendering context'i kaldırır.
- BOOL wglMakeCurrent(HDC hDC, HGLRC hRC) -> eğer programda current rendering context belirtilmezse, çağırılan openGL fonksiyonları hiçbir işlem yapmaz. Çünkü rendering context, openGL'in çalışması için gerekli tüm bilgileri içermektedir. wglMakeCurrent(hDC, NULL) fonksiyonunu çağırırsak, current rendering context'imizi null'a eşitleyip,kullanılan rendering context'imizi serbest bırakmış oluruz.

Merhaba

Yeni blog'uma başlamış bulunuyorum. Genel olarak programlama ile uğraşırken karşılaştığım sorunları yada bana ilginç gelen içerikleri paylaşmayı amaçlıyorum. Önümüzdeki girdilerde görüşmek üzere :)