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

İlk OpenGL ile şekiller çizmek

Artik OpenGL temellerini aldiginiza gore bundan sonra dersleri biraz daha hizli gecebiliriz.Ancak bundan once anlatilanlari tamamen anladiginizdan emin olmalisiniz.Bu derste OpenGL ile ekrana bazi sekiller cizmeyi ogrenecegiz.Bunun icin gerekli olan source code asagidadir.

Göster Gizle Kopar Satır Gizle Satır Göster
#include <windows.h>
#include <gl/glut.h>

// Goruntuyu cizmek icin cagrilir
void RenderScene(void)
  {
  // Varolan renk ayarlari ile ekrani temizle
  glClear(GL_COLOR_BUFFER_BIT);

     // Varolan cizim rengini kirmiziya ayarla
  //       R   G     B
  glColor3f(1.0f, 0.0f, 0.0f);

  // Su andaki renkle doldurulmus bir dikdortgen ciz
  glRectf(100.0f, 150.0f, 150.0f, 100.0f);

  // Cizim komutlarini akit
    glFlush();
  }


// Cizim durumunu ayarla
void SetupRC(void)
    {
    // Cizim rengini maviye ayarla
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);


    }



// Pencere yeniden boyutlandirildiginda GLUT kutuphanesig tarafindan cagrilir
void ChangeSize(GLsizei w, GLsizei h)
  {
  // Sifir ile bolumu engelle
  if(h == 0)
    h = 1;
    
  // Goruntu kapisini pencere boyutlarina gore ayarla
    glViewport(0, 0, w, h);

  // Koordinat sistemini sifirla
  glMatrixMode(GL_PROJECTION);
  glLoadIdentity();

  //Kesim hacmini al(sol, sag, alt,ust, yakin, uzak)
    if (w <= h) 
    glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0);
    else 
    glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  }

// Program ana giris noktasi
void main(void)
    {
  glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  glutCreateWindow("GLRect");
  glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);

  SetupRC();

  glutMainLoop();
    }

Bir dikdortgen cizmek

Onceki ornekte programimiz sadece ekrani temizliyordu.Bu ornekte ise programimiza

glColor3f(1.0f,0.0f,0.0f);
glRectf(100.0f,150.0f,150.0f,100.0f);

satirlarini ekledik.Bu satirlardan ilki daha sonraki cizim islemimizin rengini ve ikincisi ise dolu bir dikdorgen cizmeye yaramaktadir.

glColor3f icine aldigi parametrelerle kirmizi yesil ve mavi bilesenlerin karisimini kullanarak belirtilen rengi cizim islemlerinde kullanilcagini programa bildirir.

glRectf te ise dikdortgenin koordinatlari alinir.Bu fonksiyonun parametreleri sirasiyla diktortgenin x1,y1,x2, ve y2 koordinatlari olarak ta ele alinabilir.Burada x1,y1 diktorgenin sol ust kosesinin koordinat eksenindeki yerini x2,y2 ise sag alt kosenin eksendeki yerini belirtmektedir.

Peki OpenGL bu kjoordinatlari pencere icerisinde nasil ayarlamaktadir.İste bu ayarlam icin ChangeSize fonksiyonu kullanilmaktadir.Bu fonksiyon pencere yeniden boyutlandirildiginda devreye girer ve fonksiyonun ayarlamasi glutReshapeFunc fonksiyonu tarafindan programin isletimi sirasinda yapilmaktadir.Pencere boyutu ve büyüklügü her degistiginde koordinat sistemini sifirlamak zorundasiniz,eger boyle olmasaydi goruntuler birbirine girerdi.

Pencereye olcekleme

Goruntu kapisini ayarlama(Viewport setting) ve kesim hacmi(Clipping Volume)

Cizimimiz 2D bir dikdortgen oldugu halde OpenGL bu cizimi 3D bir koordinat ekseninde gerceklestirmektedir.glRectf fonksiyonu belirtilen x ve y koordinatlarinda sekli cizerken z koordinatini 0 esas alir.Pencere her boyutlandirildiginda söz konusu koordinat eksenini sifirlamalisiniz yoksa mesela pencereyi asagi dosgru uzatirsaniz dikdortgende ayni oranda uzer.Biz boyutun kontrolümüz disinda degismesini istemiyoruz.Pencere boyutlari degisik platformda degisik ele alindigi icin OpenGL karsilik gelen boyutlandirma fonksiyonunu(ornekte ChangeSize) glutReshapeFunc yordaminin icine parametre olarak alir.Parametre olarak alinan ChangeSize fonksiyonu void ChangeSize(GLsizei w,GLsizei h); seklinde bir prototipe sahiptir.

ChangeSize fonksiyonu yeni gensilik ve yukseklik degerlerini pencere yeniden boyulandirildiginda ogrenir ancak bu isi icin gercek ekran koordinatlarinin istenen koordinatlarla ortusturulmesi gerekir.Bunun icin glViewport ve glOrtho adli iki fonksiyon kullanilmaktadir.

ViewPort Tanimi

Viewport fonksiyonunun protoipi asagidaki formattadir.

glViewport(GLint x,GLint y,GLsizei genislik,GLsizei yukseklik);

x ve y parametreleri viewportun sol ust kosesini tanimlamakta ve genislik ve yukseklikte boyutlari piksel cinsinden belirtmektedir.Genellikle x ve y degerleri 0 a esittir ancak bir pencerenin icinde birden fazla cizim alani kullanilacaksa bu degisebilir.(Ornek:Sag alt kosede bir savas ucagi radar ekrani gibi)Viewport OpenGL nin kullanabilecegi gercek cizim koordinat alanini belirlemektedir.Egre gercek pencerekoordinatlarindan daha kucuk bir viewport belirlerseniz cizim daha kucuk olarak olceklenecektir.

Kesim hacminin belirlenmesi

Kesim hacmi gorunus oraninin bir kare olarak korunmasini saglamaktadir.Gorunus orani(Aspect Ratio) dikey poziyondaki piksellerin yatay pozisyondaki piksellerle aralarindaki orana verilen addir.Gorunus oraninin 1.0 olmasi kare olmasi anlamina gelmektedir.0,5 olmasi ise her 2 yatay piksele karsi bir dikey pikselin olmasi demektir.

Eger kare olmayan bir viewport kare olarak tanimlanan bir goruntu orani ile ortusturulurse goruntu bozulur.Bunu aklinizda tutmalisiniz.

void glOrtho(GLdouble sol,GLdouble sag,GLdouble alt,GLdouble ust,GLdouble yakin,GLdouble uzak);

OpenGL komutumuzun prototipidir.3D Kartezyen koordinatinda sol ve sag yatay eksendeki maksimum ve minimum degerleri,alt ve ust dikey eksendeki max ve min degerleri ve yakin ve uzak z eksenindeki max ve min degerleri gosterir.(Yakin ekrandan bize uzak bizden ekran icine).

glOrtho kullanimindan once glMartixMode(GL_PROJECTION); ve glLoadIdentity(); adli iki fonksiyon dikkatinizi cekmistir.

Ilk fonksiyonda parametre olarak alinan Projeksiyon matrisi gercek goruntu hacminizin tanimlandigi yerdir.glLoadIdentity gereklidir cunku glOrtho kesim hacmini olusturamaz ancak varolanini degistirir.glOrtho varolan kesim hacmi ile argumanlarinda belirtilen kesim hacmini belirten matris ile carpar.Simdilik glLoadIdentity fonksiyonunun herhangi bir matrsi islemi yapilmadan once koordinat sistemini sifirladigini bilmeniz yeterlidir.Bu sifirlama olmadan istenen kesim hacmi disinda degerler elde edilmesi ve bu yüzden goruntunun gorunmemesi bile mumkundur.

Son iki satir kodumuz glMatrixMode(GL_MODELVIEW); ve glLoadIdentity(); OpenGL ye tüm gelecekteki donusumlerin modellerimizi etkileyecegini anlatmaktadir.Bu konuyu ilerde anlatacagim.

Kareyi kare olarak koruma

if (w <= h) 
glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0);
else 
glOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0);

Bu kod dizisi goruntumuzu kare olarak korumaya yarar.Gorunebilen koordinat alanimiz sol kenar daima x=0 da olacak sekilde degistirilmektedir.Sag taraf eger pencere genisligi boyutundan yuksek olmadikca 250 piksele kadar genisletilmektedir.Bu durumda sag kisim pencerenin goruntu orani kadar genisletilmis olur.Alt kisim daima y=0 dadir ve eger pencerre boyu eninden daha uzun olmadikca 250 ye kadar buyutulmektedir.Boylelikle koordinat boyu pencere boyutundan bagimsiz olarak 250X250 boyutunda korunmaktadir.Bu bazilariniza karisik gelebilir.Kisaca bu paragraf goruntu ekran ile ortusturulup boyutunun ortada sabit kalmasi icindir.

Dosya Listesi

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