21 Ekim 2006

OpenGL denemeleri

OpenGL öğrenmeye çalışıyorum. İlk şaşkınlığımı koordinat sistemi yüzünden yaşadım. Çoğu programlama dili dikey ekseni tersten alıp aşağıya indikçe y değerini artan biçimde kabul ediyor. Ancak OpenGL matematiksel koordinarlara uygun biçimde yukarıya çıktıkça dikey eksen değerinin arttığını kabul etmiş, yani koordinat merkezi sol alt köşe olarak alınıyor. İlk denememde içi dolu bir E harfi oluşturmaya çalıştım. Bunun içinde GL_POLYGON özelliğini kullandım.
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); //Çizim alanımızın
//sınırları, sırasıyla sol sağ alt üst yakın uzak, örneğin
//yatay eksende minimum -1 maksimum +1 değerlerini
//verebiliyorum
glColor3f(0.0, 0.0, 1.0); // RGB modunda renk değerleri,
                          //şu aşamada beyaz
glBegin(GL_POLYGON);
  glVertex2f(-0.5, 0.5);
  glVertex2f(-0.3, 0.5);
  glVertex2f(-0.3, 0.45);
  glVertex2f(-0.45, 0.45);
  glVertex2f(-0.45, 0.025);
  glVertex2f(-0.3, 0.025);
  glVertex2f(-0.3, -0.025);
  glVertex2f(-0.45, -0.025);
  glVertex2f(-0.45, -0.45);
  glVertex2f(-0.3, -0.45);
  glVertex2f(-0.3, -0.5);
  glVertex2f(-0.5, -0.5);
glEnd();
İlk yazdığım kod bu şekildeydi, tabii hiç beklemediğim bir şekilde şu sonucu aldım. Daha sonra acaba verdiğim noktalarda mı hata var diyerek GL_POLYGON özelliğini GL_LINE_LOOP a çevirdim.
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glColor3f(0.0, 0.0, 1.0); // Beyaz
glBegin(GL_LINE_LOOP);
  glVertex2f(-0.5, 0.5);
  glVertex2f(-0.3, 0.5);
  glVertex2f(-0.3, 0.45);
  glVertex2f(-0.45, 0.45);
  glVertex2f(-0.45, 0.025);
  glVertex2f(-0.3, 0.025);
  glVertex2f(-0.3, -0.025);
  glVertex2f(-0.45, -0.025);
  glVertex2f(-0.45, -0.45);
  glVertex2f(-0.3, -0.45);
  glVertex2f(-0.3, -0.5);
  glVertex2f(-0.5, -0.5);
glEnd();
ve şu sonucu aldım. Anladım ki verdiğim noktalar doğru. Biraz araştırma yaptıktan sonra GL_POLYGON özelliğinin maalesef iç bükey olarak çalışamadığı sadece dış bükey durumlarda doğru sonuçlar verdiğini öğrendim. Sonrasında şeklimi parçalara ayırarak bir daha denedim.
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glColor3f(0.0, 0.0, 1.0); // Beyaz
glBegin(GL_POLYGON);  //Bu bölüm
                      //üstteki yatay parçayı çiziyor.
  glVertex2f(-0.5, 0.45);
  glVertex2f(-0.5, 0.5);
  glVertex2f(-0.3, 0.5);
  glVertex2f(-0.3, 0.45);
glEnd();
glColor3f(1.0, 0.0, 0.0); // Kırmızı
glBegin(GL_POLYGON);  //Bu bölüm 
                      //soldaki dikey parçayı çiziyor.
  glVertex2f(-0.45, 0.45);
  glVertex2f(-0.45, -0.45);
  glVertex2f(-0.5, -0.45);
  glVertex2f(-0.5, 0.45);
glEnd();
glColor3f(0.0, 0.0, 1.0);  //Mavi
glBegin(GL_POLYGON);  //Bu bölüm
                      //ortadaki yatay parçayı çiziyor.
  glVertex2f(-0.45, 0.025);
  glVertex2f(-0.3, 0.025);
  glVertex2f(-0.3, -0.025);
  glVertex2f(-0.45, -0.025);
glEnd();
glColor3f(1.0, 1.0, 1.0);  //Beyaz
glBegin(GL_POLYGON); //Bu bölüm
                     //alttaki yatay parçayı çiziyor.
  glVertex2f(-0.5, -0.45);
  glVertex2f(-0.5, -0.5);
  glVertex2f(-0.3, -0.5);
  glVertex2f(-0.3, -0.45);
glEnd();
ve sonuç; Bingo! Sonunda doğru sonucu elde ettim ama bu aşamada GL_POLYGON özelliğini kullanmanın bir esprisi kalmadı. Bunun yerine dört noktanın içerisini dolduran GL_QUADS özelliği de kullanılabilir.
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0); 
glColor3f(0.0, 0.0, 1.0); // Beyaz
glBegin(GL_QUADS);  //Bu bölüm
                    //üstteki yatay parçayı çiziyor.
  glVertex2f(-0.5, 0.45);
  glVertex2f(-0.5, 0.5);
  glVertex2f(-0.3, 0.5);
  glVertex2f(-0.3, 0.45);
glEnd();
glColor3f(1.0, 0.0, 0.0); // Kırmızı
glBegin(GL_QUADS);  //Bu bölüm
                    //soldaki dikey parçayı çiziyor.
  glVertex2f(-0.45, 0.45);
  glVertex2f(-0.45, -0.45);
  glVertex2f(-0.5, -0.45);
  glVertex2f(-0.5, 0.45);
glEnd();
glColor3f(0.0, 0.0, 1.0);  //Mavi
glBegin(GL_QUADS);  //Bu bölüm
                    //ortadaki yatay parçayı çiziyor.
  glVertex2f(-0.45, 0.025);
  glVertex2f(-0.3, 0.025);
  glVertex2f(-0.3, -0.025);
  glVertex2f(-0.45, -0.025);
glEnd();
glColor3f(1.0, 1.0, 1.0);  //Beyaz
glBegin(GL_QUADS); //Bu bölüm
                   //alttaki yatay parçayı çiziyor.
  glVertex2f(-0.5, -0.45);
  glVertex2f(-0.5, -0.5);
  glVertex2f(-0.3, -0.5);
  glVertex2f(-0.3, -0.45);
glEnd();
veya daha da basitleştirip
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
glColor3f(0.0, 0.0, 1.0); // Beyaz

//Bu bölüm üstteki yatay parçayı çiziyor.
//glRectf(x1, y1, x2, y2);    
glRectf(-0.5, 0.5, -0.3, 0.45);


glColor3f(1.0, 0.0, 0.0); // Kırmızı
//Bu bölüm soldaki dikey parçayı çiziyor.
glRectf(-0.5, 0.45, -0.45, -0.45); 

glColor3f(0.0, 0.0, 1.0);  //Mavi
//Bu bölüm ortadaki yatay parçayı çiziyor.
glRectf(-0.45, 0.025, -0.3, -0.025);
glColor3f(1.0, 1.0, 1.0);  //Beyaz
//Bu bölüm alttaki yatay parçayı çiziyor.
glRectf(-0.5, -0.45, -0.3, -0.5);
dikdörtgen çizmekte kullanılan glRectf komutu kullanılanıbilir.

Hiç yorum yok: