Bu içerik 5 yıl önce eklendi.
Bu sebeple içerik güncelliğini yitirmiş olabilir.

Uzunca süredir aklımda OpenGL ile ilgili bir yazı dizisi yazma fikri vardı. Fakat hem yeterli bilgimin olmadığını düşünmem, hem de pek kimsenin (hatta hiç kimsenin) ilgilenmeyeceğini düşünmem yüzünden pek yeltenmemiştim bu işe.

Şu an sıkıntıdan patlamış bir halde beklerken en azından temel olarak anlatım olan bir yazı yazayım; belki tesadüfen birilerinin işine yarar diye düşündüm. Ama ilk kez birilerine bu şekilde bir şey anlatmaya yeltendim; çok bir şey beklemeyin o yüzden.

En azından C++ ile ilgili ufak bir fikriniz olduğunu varsayıyorum.

Ben programlama için Visual Studio 2010 C++ Express kullanıyorum. Eğer ücretsiz olarak indirmek isterseniz ufak bir arama ile Microsoft’un kendi sitesinden indirebilirsiniz. Ayrıca OpenGL için hazırlanmış bir kütüphane olan glut’u da şuradan indirebilirsiniz:

http://user.xmission.com/~nate/glut.html

İndirdiğiniz sıkıştırılmış dosya içerisinde bulunan dosyaları projeniz ile aynı klasör içine atmanız lazım. (.cpp uzantılı dosyanızın olduğu dizine).

Projemizin bu  attığımız dosyaları görmesi için de kodumuzun en tepesine (şu an kodumuz olmadığı için bodoslama yazıyoruz en tepeye) şunu yazıyoruz:

#pragma comment (lib, “glut32.lib”)

#include <stdio.h>
#include “glut.h”

İlk satır Visual Studio’ya harici kütüphaneleri tanıtma amaçlı kullanılıyor. Eğer farklı bir IDE kullanacaksanız bu tanımlamayı, proje ayarlarından elle yapmanız gerekecektir. Diğer satırlar ise bildiğimiz include satırları zaten.

Evet bunu yazdık. Şimdi gelelim main’imize. Her C++ kodunda olduğu gibi burada da bir mainimiz olacak. Temel olarak main’imiz şuna benzeyecek:

int main(int argc, char ** argv)
{

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowPosition(50, 100);
glutInitWindowSize(800,600);
glutCreateWindow(“title”);

glutDisplayFunc(draw);
glutIdleFunc(idle);

glOrtho(0, 800, 600, 0, -1, 1);

myInit();

glutMainLoop();

return 0;

}

Satır satır incelemek gerekirse:

glutInit(&argc, argv); glut için gerekli olan ayarlamaları yapar. O yüzden main’imizin siftahını bu satırla açıyoruz.

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); renk paleti ve derinliği gibi ayarlamalar yapılır bu satırda. Fakat temel bir proje için GLUT’un default ayarlarını (yani aynen burada yazılan şekilde) kullanmak daha mantıklı olacaktır.

glutInitWindowPosition(50, 100); Pencerenin tam olarak nerede oluşturulacağını belirler bu satır. Mesela burada penceremizin sol üst köşesi x=50 ve y=100 noktasında olacak şekilde oluşturuluyor pencere. 0,0 noktası ekranınızın sol üst köşesine gelecek şekilde istediğiniz gibi değiştirip; keyfinize göre bir noktada oluşturabilirsiniz pencerenizi.

glutInitWindowSize(800,600); Pencerenin boyutunu belirler.

glutCreateWindow(“title”); Tam bu satırda penceremiz oluşturulmuştur. Ayrıca bu fonksiyona yolladığımız parametre penceremizin başlığı olacaktır.

glutDisplayFunc(draw); Çizimi yapacağımız fonksiyonu tanıtıyoruz bu satırda. Burada draw dedik ama, “Ben murtaza fonksiyonuyla çizicem arkadaş” derseniz glut size “Kim bu Murtaza?” diye sormaz. Yani ismi siz belirleyebilirsiniz. Zaten bu fonksiyon var olan bir fonksiyon değil; biraz sonra biz oluşturacağız.

glutIdleFunc(idle); Bir üst satırda olduğu gibi burada da bir fonksiyon tanıtıyoruz. Çizim fonksiyonunda ekrana çizeceğimiz şeyleri çizip bitirdikten sonra program bu kısma gelecek; yani “İşim bitti, şimdi ne yapayım?” diye soruyor olacak.

glOrtho(0, 800, 600, 0, -1, 1); Giriş seviyesinde çok ihtiyacınız olmayacak bir satır bu. Sadece ekran boyutunu değiştirirseniz buradaki 800 ve 600 değerlerini de değiştirmeyi unutmayın; kafanız karışmasın. Ha ben merak ettim derseniz; mesela 800×600 çözünürlükte bir pencere oluşturmanıza rağmen; 800,600 yerine 100,100 yaparsanız ekranın tam ortasına bir şey çizdirmek için 50,50 koordinatına çizim yapmanız gerekecektir. Ayrıca sağı, solu, yukarıyı, aşağıyı da buradan ters düz edebilme şansınız var; ama dediğim gibi giriş seviyesinde kurcalayıp kafanızı karıştırmayın bence.

myInit(); Bu fonksiyonu da biz tanımlayacağız; isterseniz ismini değiştirebilirsiniz yani. Bunun amacı, program ilk başladığında yapılacak işlerimiz varsa onları yaptırmak. Örneğin resimlerin dosyadan okunması gibi işleri bu kısımda yapabiliriz. Ama şimdilik boş bir fonksiyondan ibaret olacak. Sadece şunu unutmayın; draw ve idle fonksiyonlarımızdan önce bu fonksiyon sadece bir kereliğine çalışacaktır. Eğer her şeyden önce tanımlamanız gereken şeyler varsa bu fonksiyonda tanımlayın.

glutMainLoop(); Açıkçası ne iş yaptığını ben de tam bilmesem de; bizim için bir kaç şeyi düzenlemesi için en sona bu satırı da yazmalıyız.

Main tamam; ama az önce bir kaç fonksiyon tanımlayacağımızı söylemiştik. mainimizin üstüne bu fonksiyonları şimdilik boş olarak tanımlayalım.

void draw()
{

}

void idle()
{

}
void myInit()
{

Ve kodumuzu derleyip çalıştıralım… Kalbimizden bile temiz bir pencere çıktı değil mi? Şimdi gelelim bu boş fonksiyonları doldurma kısmına. İlk olarak idle fonksiyonumuzu şu şekilde dolduralım.

void idle()
{

draw();

}

draw fonksiyonu işini bitirince idle’a girecek programımız. Ama biz, sürekli ekrana çizdirdiğimiz şeylerin yenilenmesini istiyoruz, bu yüzden iş bittiğinde tekrar draw’ı çağırması için böyle yazıyoruz. Bu tekrar çağırma işi, ekranın yeniden yeniden çizilmesine sebep olur. Bu sayede hareketli cisimlerin hareket etmesi sağlanır. Oynadığımız tüm oyunların çalışma mantığı da budur. Sinemadaki gibi resimlerin peş peşe gelmesi ile hareket oluşur. İşte bu peş peşe gelme işleminde ekranı sürekli yeni baştan çizdirmek zorundayız ki resimler üst üste binmesin, ya da başka sorunlar ortaya çıkmasın.

draw fonksiyonun içini ise şöyle dolduralım:

void draw()
{

glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);

glutSwapBuffers();

}

Burada yaptığımız ekran temizlendiğinde ve yeniden çizilmeye başlandığında; arkaplanın ne renge boyanacağını seçmek ve ekranın yeniden çizilmesini sağlamak. 0,0,0,1 parametreleri red,green,blue,alpha şeklinde renk belirleme paremetreleridir. 0’dan 1’e kadar değişen bu paremetrelerle tüm renkler belirlenir. Renkler konusunda bir sonraki yazımda ufak bir açıklama yapacağım zaten, o yüzden burada çok uzatmıyorum.

Bundan sonraki her şeyi draw fonksiyonu içinde yapacağız.  Onlar da diğer kısımlarda olacak.

Tüm kısımlara ulaşmak için tıklayın.

KınıX

This article has 2 comments

  1. Emre demirkol

    Visual Studio 2010 da Opengl çalışmadı .cpp olan dizinin içerisinde olmasına rağmen

  2. KınıX

    Eğer aldığınız hatayı buradan, ya da mail ile ([email protected]) bana gönderirseniz yardımcı olmaya çalışırım.
    Gerçi ben de uzman sayılmam bu konuda, ama elimden geleni yaparım en azından.

Leave a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir