Yazan: Şadi Evren ŞEKER
Open GL, bilgisayar grafikleri için kullanılan bir 3 boyutlu geliştirme platformudur. Platform çeşitli dillerde kod yazılmasına izin verir (örneğin JAVA, C, C++ gibi) ve platformun dillerden bağımsız olarak kendisine özgü bir fonksiyon kütüphanesi bulunur.
Açık kaynak kodlu olan platformun farklı ortamlarda rahatça kullanılabiliryor olması geniş bir kullanım alanına sahip olmasını sağlamıştır. Dillerden bağımsız olarak pekçok işletim sistemi ve geliştirme ortamında da kod yazılabilmektedir. Platformun çalışabilmesi için bilgisayarda bulunan ekran kartının desteklenmesi gerekmesi bazı kurulumlarda problem yaratmaktadır.
Windows için geliştirme ortamlarından birisi olan DEV C++ bilgisayara başarıyla kurulduktan sonra basit Open GL uygulamaları hızlıca geliştirilebilir. Aşağıda DEV-C++ ile yazılmış basit bir uygulama örneği açıklanmıştır:
#include <windows.h> #include "glutil.h"
windows üzerinde glutil kütüphanesi ile kod yazılacaktır. Open GL fonksiyonları bu kütüphanede bulunduğu için include edilir.
OpenGL *opengl;
OepnGL sınıfından (class) bir gösterici (pointer) tanımlanmıştır. Daha ileride bu gösterici kullanılacaktır.
bool init() { glClearColor(0.93f, 0.93f, 0.93f, 0.0f); glColor3f(0.0f, 0.0f, 0.0f); return true; }
Kodun init fonksiyonudur. ve kod ilk çalıştırıldığında ekranı ve renk sistemini temizlemek için kullanılan fonksiyonları çağırır.
void display()
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_LINE_STRIP);
glVertex3f(-1.0f, 1.0f, 0.0f);
glVertex3f(-0.5f, 0.5f, 0.0f);
glVertex3f(-0.7f, 0.5f, 0.0f);
glEnd();
glBegin(GL_TRIANGLES);
glVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f( 0.5f, -0.5f, 0.0f);
glVertex3f( 0.0f, 0.5f, 0.0f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-1.0f, -1.0f, 0.0f);
glVertex3f(-0.5f, -1.0f, 0.0f);
glVertex3f(-0.5f, -0.5f, 0.0f);
glVertex3f(-1.0f, -0.5f, 0.0f);
glEnd();
glBegin(GL_POLYGON);
glVertex3f( 0.8f, 0.6f, 0.0f);
glVertex3f( 0.9f, 0.8f, 0.0f);
glVertex3f( 0.5f, 0.9f, 0.0f);
glVertex3f( 0.6f, 0.5f, 0.0f);
glEnd();
glFlush();
}
Yukarıdaki kod display fonksiyonudur. Bu kodun içerisinde basit bazı varlıklar çizilmiştir. Sırasıyla her glBegin ve glEnd arasında kalan grupta bir doğru, üçgen, dörtgen ve çokgen (poligonI) çizilmiş ve bu çizme işlemi çin geçerli olacak köşe noktalarının koordinatları verilmiştir.
void idle()
{
}
Open GL için animasyonlarda anlamlı olan fonksiyon, bu uygulama için boş bırakılmıştır.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
opengl = OpenGL::create();
opengl->setInitFunc(init);
opengl->setDisplayFunc(display);
opengl->setIdleFunc(idle);
if (!opengl->initGL("05 - Primitives", 500, 500, false, 32))
return 1;
opengl->runMessageLoop();
return 0;
}
windows.h dosyası include edilerek oluşturulan uygulamamızda klasik c, c++ programlamasından farklı olarak main() fonksiyonu yerine windows’un main fonksiyonu olan WinMain fonksiyonu kodlanmıştır. Kodun başında tanımlanmış olan ve OpenGL sınıfından bir gösterici olan opengl değişkeni burada değer kazanmış ve OpenGL kütüphanesinden create() fonksiyonunu çağırarak çalışma ortamını hazırlamıştır.
Daha sonra kullanılacak olan özel fonksiyonlar belirlenmiştir. Buna göre OpenGL ortamının init, display ve idle fonksiyonlarının kodumuzdaki hangi fonksiyonlara karşılık geldiği belirtilmiştir.
Bu 3 fonksiyon dışında da özel fonksiyonlar bulunmakta ve bunlar da benzer tanımlamalar ile koddaki başka fonksiyonlara bağlanabilmektedir. (örneğin klavye işlemlerinin hangi fonksiyon tarafından algılanacağının belirlenmesi gibi)
if kontrolü içerisinde bir opengl penceresi açılmış pencerenin başlığına “05 – Primitives” yazısı yazılmış, pencerinin boyutu (eni ve boyu) 500’e 500 olarak berlirlenmiştir.
son olarak opengl göstericisinin runMessageLoop fonksiyonu çağırılarak opengl’in çalıştığı ana döngü tetiklenmiş ve return 0 ile de kod bitmiştir.
Çalışan kod aşağıdaki şekildedir:
OpenGL bir platform değil bir arayüzdür.