opengl etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
opengl etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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ı

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.