İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır

İlk OpenGL Programının Açıklaması

Onceki derste vermis oldugumuz OpenGL demomuzu calistirdiktan sonra sira icerisindeki kodu aciklamaya geldi.Sİmdi sira ile temel bir OpenGL kaynak kodundaki bilsenleri inceliyoruz.

Basliklar

#include<windows.h>
 
#include<gl/glut.h>

Bu include ifadeleri programimizda kullandigimiz temel islev fonksiyonlarinin prortiplerinin bulundugu kutuphaneleri programimiza eklemeye yarar.Bu kutuphaneleri eklemeden fonksiyonlari cagirmamiz beklenemez.

windows.h kutuphanesi tum windows tabanli programlarda bulunmasi gereken bir kutuphanedir.Bu kutuphanede bircok Windows 32 yordam prototipleri ulunmaktadir.Ancak bu dosya istege baglidir,bnun sebebi GlUT ın WIN32 versiyonu zaten GLUT.H icerisinde tanimlanmistir ve bu yuzden ayrı olarak tanimlamaya gerek yoktur.Ben size tam uyum icin bu dosyayi da eklemeniz gerektigini tavsiye ederim.glut.h dosyasi ise anladiginiz üzere OpenGL yordamlarinin protoiplerini icermektedir.Burada onemli olan ksiim glut.h in icersinde gl.h ve glu.h tanimlarini da icermesidir.Bu yuzden bu iki dosyayi da ayri olarak programiniza eklemenize gerek yoktur.Eger glut kullanmayacaksaniz bunlari eklemeniz gerektiginiğ unutmayin.

Program vucudu

Simdi programimizinin geri kalan kismini inceleyelim.

void main(void)

{

Tüm C ve C++ programlari daima main adinda bir fonksiyonun calistirilmasi ile start almaktadir.C,C++ bilenleriniz bunu gayet iyi bilirler.Eger bir Windows programcisiysaniz WinMain fonksiyonunun bu ornekte nerede oldugunu merak edebilirsiniz.Bu ornekte WinMain fonksiyonu bulunmamaktadir cunku dikkat ettiyseniz C++ projemizi bir console-mode application(konsol uygulamasi) olarak secmistik.Bu yuzden herhangi bir pencere yaratimi veya mesaj dongusu ile ugrasmamiza gerek yoktur.Win32 kullanarak konsol uygulamalarinda grafiksel pencereler kullanmak mümkündür.(aynen GUI uygulamalarinda oldugu gibi)Bu ayrintilar GLUT kütüphanesinin icerisinde gömülüdür.Unutmayin ki GLUT boyle platform ayrintilarini gizlemek icin vardir ve bu yüzden biz bu kutuphaneyi sectik.

Goruntu Modu:Tek tamponlu(Single buffered)

Ilk kod satirimizda asagidaki ifadeyi gorduk.

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);

Bu ifade GLUT kutuphanesine goruntu penceremizi yaratirken ne tür bir goruntu modu kullanacagimizi belirtir. Ifeadenin icersindeki bayraklar (flags) tek tamponlu pencere ve RGBA renk modu kullanilacagimiz zaman yazilmalidir.Tek tamponlu pencerenin anlami cizim komutlarinin verildigi anda pencere uzerinde uygulanmasidir.Bunun bil alternatifi double buffering(cift tamponlama) dir.Bu durumda ise cizim komutlari hafizada ekran ciktisinin olusturulup cizim komutlarinin burada islenmesi ve bir onceki frame in o anda ekranda gosterilmesidir.Daha sonra ekran goruntusu hafizdaki ile yer degistirmektedir.Double Buffering OpenGL programlarinda goruntunun animasyonlarda kesik kesik gelmesini onlemek icin kullanilmaktadir.Buna ileride deginecegiz.RGBA renk modu ise renkleri kirmizi yesil ve mavi renkleri kullanarak olusturacagimiz belirtmektedir.

OpenGL penfceresini olusturmak

Siradaki GLUT cagrisi pencereyi ekranda olusturmaya yaramaktadri.

glutDisplayFunc(RenderScene);

Bu ifade daha onceden tanimlanmis Render Scene fonksiyonunu goruntu cagri fonksiyonu olarak atar.Bunun anlami GLUT in pencerenin cizimi sirasinda daima burada isaret edilen yordami cagirmasidir.Bu cagri pencere ilk olusturuldugunda veya pencere yeniden boyutlandirilip tekrar acildiginda gercekledmektedir.Burasi tum cizim fonksiyon cagrilarinin konulmasi gereken yerdir

Konteksti olusturma

Asagidaki satir ne GLUT a ne de OpenGL ye ozgudur ancak derslerde izleyecegimiz bir yoldur.

SetupRC();

Bu fonksiyon cizimden once yapmak istedigimiz tum OpenGL baslatiminin yaptigimiz yerdir. Cogu OpenGL durumlari bir kere ayarlanmali ve tüm goruntu kareleri(frames) icin ayri ayri tanimlanmamalidir.

glutMainLoop();

Son olarak glutMainLoop satiri GLUT goruntu kareleri islerinin calismasini saglar.Ekran gooruntusu icin gereken callback(cagrilar) ve diger fonksiyonlari tanimladiktan sonra GLUT i serbest birakmalisiniz.Bu fonksiyon tum isletim sistemine ozgu mesaj,klab-vye komutlari gibi islevleri program sona erene kadar yerine getirir.

OpenGL Grafik Cagrilari

SetupRC fonksiyonu tek bir OpenGL fonksiyon cagrisi icermektedir.Bu gordugunuz uzere

glClearColor(0.0f,0.0f,1.0f,1.0f);

tir.

Bu fonksiyon ekranin hangi renkte temizlenecegini belirtir.Bu fonksiyon icin tanimlanan prototip

void glClearColor(GLclampf red,GLclampf green,GLclampf blue,GLclampf alpha);

seklindedir.

GLclampf OpenGL nin cogu tanimlari icerisinde bir ondalik sayi tipi olarak tanimlanmistir.OpenGL de bir renk kirmizi , yesi ve mavi bilesenlerden olsuturulmaktadir.Her bir bilesenin miktari 0.0 dan 1.0 siddeti arasinda tanimlanabilmektedir.Windows deneyimi olanlar icin bir ornek vermek gerekirse bu, Windows ta RGB makrosu kullanilarak COLORREF kullanmaya benzer bir durumdur.Fark ise Windows ta her renk bilesenine 0 dan 255 e kadar deger verilir.Bu 256*256*256 = 16 milyondan fazla renk tanimi anlamina gelmektedir.OpenGL de ise her renk bileseni 0 ile 1 arasinda herhangi bir deger alabilir ve bu da teorik olarak sinirsiz sayida potansiyel renk anlamina gelmektedir.Pratik olarak gunumuzde cogu cihazda OpenGL renk siniri 32 bit yani 4,294 milyar renk ile sinirlandirilmistir.

Dogal olarak hem Windows hem OpenGL bu renk degerini alarak kendi iclerinde video donanim ve paletinde rengin en yakin karsiligina cevirirler.Asagidaki tablo hangi bilesenden ne kadar kullarak bazi temel renkleri olurturabileceginizi gostermektedir.

Kompozit renk Kırmızı bilesenYesil bilesen Mavi bilesen
Siyah0,00,00,0
Kırmızı1,00,00,0
Yeşil0,01,00,0
Sarı1,01,00,0
Mavi0,00,01,0
Eflatun/Kirmizi1,00,01,0
Acik Mavi0,01,01,0
Koyu gri0,250,250,25
Açık gri0,750,750,75
Kahverengi0,600,400,12
Papatya turuncusu0,980,6250,12
Pastel pembe0,980,040,7
Mor0,600,400,70
Beyaz1,01,01,0

glClear ifadesinin son argimani ise alpha bilesenini gostermektedir.Alpha bilseni gecirgenlik ve karisimlar icin kullanilmaktadir.Mesela bir cam efekti vermek ve arkasinda bir isik huzmesi gibi ir efekt yaratmak istiyrosaniz alpha degeri uzerinde oyanamaniz gerekecektir.Bu konu ile ilgili orneklerimizi ileride gorecegiz.

Gercek temizleme

Su ana kadar yaptigimiz OpenGL ye bir renk(mavi) ile ekrani temizleme komutu vermemiz oldu.RenderScene fonksiyonumuzun tanimida ise gercek ekran temizleme icin kullandigimiz ifade;

glClear(GL_COLOR_BUFFER_BIT);

seklindedir.

glClear fonksiyonu belirli bir bellek tamponunu veya tampon bilesenlerini silmek icin kullanilmaktadir.Tampon ile kastimiz bellekte ki bir is icin ayrilmis belirli bir hafiza parcasidir.Bir cizimin kirmizi,yesil,ve mavi bileseleri renk tamponu ve ya piksel tamponu olarak adlandirilir.

Siranin akitilmasi

Son OpenGL cagrimiz

glFlush();

calistirildigi zaman tüm calistirlmayan OpenGL komutlarinin calistirlmasi saglanir.Ornegimizde tek bir komut (glClear ) bulunmaktadir.OpenGL icinde komutlari sira ile isletmek icin bir boru hatti bulundurmaktadir.OpenGL sürücüsü komutlari isletirken komutlar belirli bir siraya konur ve isletilme siralarini beklerler.kompleks objeler islenirken bu kurulum performansi arttirmaktadir.glFlush yordamimiz OpenGL ye yeni komutlar beklemeden simdiye kadar belirtilen cizim komutlari ile harekete gecmesi gerektigini soylemektedir.

İçindekilerGirişİndex
YukarıİlkÖncekiSonrakiSon
Geriİleri
Yazdır