C++ / OpenGL [ 02 – GLUT ]

GLUT kullanımı

Baslangıçta OpenGL kütüphaneleri arasinda ikincil kütüphanesi olan AUX bulunmaktaydı.Herhangi başka bir cevre(Unix,Windows) ile kafanızı dağıtmadan OpenGL programlamak için bu kütüphaneyi kullanmanız gerekiyordu.Kullanışlı uygulamalar gerçekleştirmek için gerekli olan GUI bileşenleri bu kütüphanede bulunmamaktaydı.

GLUT un acılımı OpenGL işlev aracı dır ve GLU ile karıştırılmamalıdır.(Çünkü GLU bir kütüphanedir). GUI özelliklerin daha kullanılabilir olması için geliştirilen bu araç X Window üzerinde OpenGL geliştirmenin daha uygulanabilir olması pop-up menülerin eklenmesi ek pencere yönetim destekleri ve joystick uygulamalarını daha iyi bir şekilde desteklemektedir.

GLUT diğer kütüphaneler açısından başlangıç seviyesi için ideal bir kütüphanedir.Günümüzde yeterliliğini kaybetmektedir ,yerine gelen yeni kütüphaneler daha çok destek sağlamaktadırlar. Bunlardan bazıları GLUT’un açık kaynak olarak geliştirilmiş olanı freeGLUT’tur. Diğerleri (GLEW,SDL,GLSL..)  liste uzamaktadır.Bir çok kütüphanenin destekledikleri uygulama alanları diğerlerinden farklılıklar göstermektedirler. Mantıkta yaptıkları işlem aynı olmasına rağmen ,kullanılan kod’da yazısal olarak değişiklik olur. Örnek vermemiz gerekirse;

SDL de bir pencere oluşturmak için kullanılan kod dizimi;

[c language=”++”]
SDL_Window *window; // yeni pencere icin pointer atamasi

// Yeni Pencere Olusumu asagida belirtilen ayarlar ilen
window = SDL_CreateWindow(
"ILK PENCEREM", // pencere basligi
SDL_WINDOWPOS_UNDEFINED, // x pozisyonu
SDL_WINDOWPOS_UNDEFINED, // y pozisyonu
640, // pencere boyutu,yatay pixel
480, // pencere boyutu,dikey pixel
SDL_WINDOW_SHOWN|SDL_WINDOW_OPENGL // gorunum
);
[/c]

GLUTta bir pencere oluşturmak için ise;

[c language=”++”]

glutInit(&argc,argv);                                   //GLUT cerceve yuklenmesi
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);   //Goruntu modu
glutCreateWindow("PENCERE BASLIGI");                   //Pencere Olusturmak
glutInitWindowSize (250, 250); //Penceremizin boyutu x,y
glutInitWindowPosition (100, 100); //Penceremizin ekranda bulunacagi konum x,y sol ust koseden baslayarak
[/c]

GLUT kurulumu

GLUT indirmek için ; GLUT 3.7Beta / Windows Platforms

http://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip

GLUT’u indirdikten sonra .zip dosyasında bulunan ;

glut32.dll , dosyasını [ c://windows/System32/ ]  klasörünün içine ,eğer 64 bit kullanıyorsanız ayrıca [ c://windows/sysWOW64/ ]  klasörüne atmanız gerekmektedir.

glut32.lib , dosyasını kullanmakta olduğunuz derleyicinin lib klasörüne atmanız gerekmektedir. Microsoft Visual Studio kullananlar için C://program files (x86 yada program files/)/Microsoft Visual Studio (8,9,10,11.0)/VC/lib/  

glut.h , dosyasını derleyicinin headers lerin olduğu klasöre yada ,projenizin dosyalarının olduğu yere atmanız gerekmektedir. Microsoft Visual Studio kullananlar için C://program files (x86 yada program files/)/Microsoft Visual Studio (8,9,10,11.0)/VC/include/

GL.h ve GLU.h ile birlikte ayni klasöre atmak için C://program files (x86 yada program files/)/Windows Kit/8.0/include/um/gl/

– Bütün dersler boyunca kullanmakta olacağımız program VStudio 2010-2012 olacaktır.

http://www.microsoft.com/visualstudio/eng#downloads

bu işlemler bittikten sonra programınızda glutu kullanmak için
eğer derleyici içerisinde ise;

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

projenizin içinde bir yerlerde ise;

#include “glut.h”    şeklinde cağırılması gerekmektedir.

Aşağıda sık kullanılan bazı pencere işlevleri listelenmiştir.

  • glutInit() işlevi GLUT’ı ilkler, diğer GLUT rutinlerinden önce bu komutun yazılması zorunludur.
  • glutInitDisplayMode() işlevi renk modunu belirlemektedir.
  • glutInitWindowPosition() işlevi ekranın sol-üst köşesini baza alarak grafik penceresinin ekrandaki yerini belirler.
  • glutInitWindowSize() işlevi pencerenizin büyüklüğünü ayarlar.
  • glutCreateWindow() işlevi OpenGL conteksli bir pencere oluşturur.
  • glutDisplayFunc() işlevi, çizim penceresinin içeriğinin yeniden gösterileceği durumlarda çalıştırılacak fonksiyonu (çizim işlemlerinin yapıldığı fonksiyon) çağırır. Parametre olarak bu fonksiyonun adını alır.
  • glutKeyboardFunc() ve glutMouseFunc() işlevleri klavyenin veya farenin herhangi bir tuşuna basıldığında çalıştırılacak fonksiyonu çağırır.
  • glutReshapeFunc() işlevi, pencere büyüklüğünün değişeceği durumlarda çalıştırılacak fonksiyonu çağırır.

 

OPENGL – GLUT  ILK PENCEREM [ VS 2010 ]

VS 2012’nin ağir çalışması ve kapladığı alan fazla olduğundan dolayı  ,kullanacağımız program Visual Studio 2010 olacaktır.

VS 2012’nin 2010’a göre en büyük avantajı kodlarınızı yazarken sizin hatalarınızı düzeltmesi ve yol göstermesi.

ilk önce projemizi oluşturarak başlıyoruz.

vs1

Projemizi oluşturduktan sonra Source Files(Kaynak Dosyaları)’na SAĞ tıklayarak [add(ekle)] > [new item(yeni)] diyoruz ve önümüze çıkan ekrandan ,C++ File(Dosyası) cpp’yi seçip ismini girdikten sonra ilk c++ dosyamızı oluşturmuş oluyoruz.

vs2

Buraya kadar sıkılmıs olabilirsiniz ancak yeni olan arkadaslarımız için bazi detaylara yer verdik .

Öncelikle ilk GLUT penceremizi oluşturmadan önce kütüphanelerimizi cağırıyoruz.

windows.h kütüphanesi tüm windows tabanlı programlarda bulunması gereken bir kütüphanedir.Bu kütüphanede birçok Windows 32 yordam prototipleri bulunmaktadir.Ancak bu dosya isteğe bağlıdır,bunun sebebi GLUT’un WIN32 versiyonu zaten GLUT.H icerisinde tanımlanmıstır ve bu yüzden ayrı olarak tanımlamaya gerek yoktur.

[c language=”++”]

#include <Windows.h>                 //pencere icin windows headeri
#include <gl/GL.h>                   //openGL icin genel GL headerimiz
#include <gl/GLU.h>                 //GLU fonksiyonlari icin header
#include <glut.h>                   //GLUT fonksiyonlarimiz icin headerimiz</pre>
#pragma comment(lib, "glut32.lib")    //glut32.lib manuel olarak kutuphanemizi cagiriyoruz linker
[/c]

Eğer .lib kütüphanesini Otomatik cağırılmasını istiyorsanız
VStudio 2010 kullancıları için ;Oluşturduğunuz projeye sağ tıkladıktan sonra > properties(ayarlar)
Acılan ekranda >Linker(bağlayıcı) >input(giriş) ve gözüken listeden en üstteki secenek olan [additional dependencies(ek bağımlar)]
.liblerin bulunduğu alana edit(düzenle) dedikten sonra glut32.lib’i ekleyip okey(tamam) diyoruz.

Ana fonksiyonumuzu olusturuyoruz.[main]

[c language=”++”]
void cizim(void); //kullanicagimiz alt class fonksiyonlarimizi herzaman dogru
//siralamaya gore ust kisima tekrar cagirmamiz gerekmektedir.
int main(int argc, char **argv)
{
  glutInit(&argc,argv);                   //glut pencere icin sabit komut
  glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);   //goruntu ayari
glutInitWindowSize (250, 250); //Penceremizin boyutu x,y
glutInitWindowPosition (100, 100); //Penceremizin ekranda bulunacagi konum x,y sol ust koseden baslayarak
  glutCreateWindow("BASLIK");                   //pencereyi olusturur
  glutDisplayFunc(cizim);                        //kendi cizim fonksiyonumuz
glClearColor(0.0,0.0,0.0,0.0); //penceremizin arkaplanini siyah yapar
glMatrixMode(GL_PROJECTION);   //mevcut matriximizi projection matrixine donusturur

//matrix icin perspective goruntu ayari [bir nevi ince kamera ayari]
  gluPerspective(45, //Goruntu acisi
             1.0,    //gorus orani
             10.0,   //Yakin Cekimde goruntuyu kesme noktasi
             200.0); //Uzak Mesafe goruntu kesme noktasi [bir nevi 3 boyutlu ortamin goruntu alani]
glMatrixMode(GL_MODELVIEW);   //bulunan matrixi model gorunumu matrixine donusturur

glutMainLoop();           //GLUT penceresi icin Ana dongu
}
[/c]

MATRIX ve Perspective method larımızı bir sonraki derslerde başka bir fonksiyon’a dahil edeceğiz.
öncelikle glutdisplaymode da bulunan metodlarımızı tanıyalım.

GLUT_RGB ; RedGreenBlue Renklerimiz için tampon(buffer) oluşturuyoruz.
[GLUT_SINGLE ; Tek tamponlu pencerenin anlamı çizim komutlarının verildiği anda pencere üzerinde uygulanmasıdır.
GLUT_DOUBLE ; Çizim komutları hafızada ekran çıktısının oluşturulup çizim komutlarınn burada işlenmesi ve bir önceki frame’in
o anda ekranda gösterilmesidir.Daha sonra ekran görüntüsü hafızadaki ile yer değistirmektedir.
GLUT_DEPTH ; Çizimin derinliği için gerekli tampon(buffer).

bir sonraki aşamada çizim için gereken fonksiyonumuzu oluşturuyoruz.

[c language=”++”]
void cizim(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //Cizimden once Ekranimizi tamamen derinlik ve renk olarak temizler.</pre>
glTranslatef(0,0,-100); //yapilacak cizimin konumunu kaydirir x,y,z (x sagsol,y asagi yukari,z uzak yakin)
glBegin(GL_TRIANGLES); //OpenGL ucgen cizimi icin cagirilan method
glColor3f(1,0,0); //suanki rengi kirmiziya donusturur
glVertex3f(-30,-30,0); //cizim icin gereken ilk noktamizin konumu

glColor3f(0,1,0); //sonraki cizim icin rengi yesil yapar
glVertex3f(30,-30,0); //ucgenimiz icin gereken 2.ci noktanin konumu

glColor3f(0,0,1); //cizim rengi mavi yapar
glVertex3f(-30,30,0); //ucgenin son noktasi icin nokta konumu
glEnd(); //OpenGL cizimi bitirme methodu

glutSwapBuffers(); //buffer lari cevirir
}
[/c]

glVertex2f(x,y); //2boyutlu matrisler için nokta çizimi,
glVertex3f(x,y,z); //3boyutlu matrisler için nokta çizimi,
3f teki (f) imiz float anlamına gelmekte bunun yanı sıra,
integer (i) ve double (d) kullanılmaktadır. [glVertex234fid]
integer ve double kullanımı çizim ortamında daha büyük oranları temsil etmektedir.

glColor3f(0,0,0) // (1,0,0) Kırmızı, (0,1,0) Yeşil, (0,0,1) Mavi
glColor3ub(255,0,0) //ub kullanımında 0-255 arası renk deşerleri verilebilir.

Kompozit renk Kırmızı bilesen Yesil bilesen Mavi bilesen
Siyah 0,0 0,0 0,0
Kırmızı 1,0 0,0 0,0
Yeşil 0,0 1,0 0,0
Sarı 1,0 1,0 0,0
Mavi 0,0 0,0 1,0
Eflatun/Kirmizi 1,0 0,0 1,0
Acik Mavi 0,0 1,0 1,0
Koyu gri 0,25 0,25 0,25
Açık gri 0,75 0,75 0,75
Kahverengi 0,60 0,40 0,12
Papatya turuncusu 0,98 0,625 0,12
Pastel pembe 0,98 0,04 0,7
Mor 0,60 0,40 0,70
Beyaz 1,0 1,0 1,0

glFlush(); //bazı programlarda kullanılan bu metod tek başına görüntüyü ekrana dök anlamına gelmektedir.
bir çok tamponla çalişan programlar icin ;
glutSwapBuffers(); kullanılmaktadır. Bu kullanıldığı sürece glFlush(); fonksiyonuna gerek yoktur.

Glut ilen Oluşturduğumuz ilk projemizin görüntüsü;

ders1glut

Ders sonunda oluşturduğumuz projenin .cpp kaynak dosyasını buradan indirebilirsiniz.

OpenGL -02

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *