Bazı OpenGL İşlevlerinin Tanıtımı
Önceki 30 Dakikada OpenGL'e Giriş Sonraki
Bazı OpenGL İşlevlerinin Tanıtımı
Burada işlevler hakkında kısa bir bilgi verilmiştir. Daha ayrıntılı bilgi almak isterseniz man sayfalarına bakınız.
Temel İşlevler
void glutInit
(int   *argcp,
 char **argv)
işlev
GLUT kitaplığının ilklendirilmesi için çağrılması gereken işlevdir. Bu çağırılmadan GLUT kitaplığından başka bir işlev çağrılamaz. Argümanlar programın main() işlevinden alınır ve değiştirilmeden kullanılır. Kullanımı söyledir:
glutInit(&argc, argv); // main(int argc, char ** argv) olduğu varsayılmıştır.
int glutCreateWindow
(char isim)
işlev
Pencere sisteminde bir pencere oluşturur ve pencere başlığına isim parametresindeki metni yazar. Pencere numarası ile döner.
void glutDisplayFunc
(int   (*islev) (void))
işlev
Pencere ekrana çizildikten sonra pencerenin içerisinde gösterilecekleri oluşturan işlevin belirtileceği işlevdir (callback).
void glutMainLoop
()
işlev
Bu işlev sayesinde program kendisine gelecek olayları (event) dinlemeye başlar ve eğer tanımlıysa gelen olaya göre tanımlanmış bir işlevi (callback) çalıştırır.
void glClear
(GLbitfield maske)
işlev
Tamponların içeriğini glClearColor, glClearIndex, glClearDepth, glClearStencil ve glClearAccum işlevleri ile belirlenen değerlerle temizler.
Parametre olarak GL_COLOR_BUFFER_BIT, GL_DEPTH_BUFFER_BIT, GL_ACCUM_BUFFER_BIT, GL_STENCIL_BUFFER_BIT sabitlerinden birini ya da bunların VEYAlanmış değerini alır.
void glBegin
(enum kip)
işlev
Bu işlev bir çizimin başlatıldığını belirtir. Aldığı parametre ise çizilen şeyin noktalar, çizgiler veya içi dolu çizgiler şeklinde görüneceğini belirtir.
Parametre olarak aldığı sembolik sabitler:
GL_POINTS
Verilen noktaları nokta olarak çizer.
GL_LINES
Verilen noktaları doğrularla birleştirir.
GL_POLYGON
Verilen noktaları doğrularla birleştirir ve oluşan şeklin içini renklendirir.
GL_QUADS
Verilen dört noktadan içi boyanmış dörtgen oluşturur.
GL_TRIANGLES
Verilen üç noktadan içi boyanmış üçgen oluşturur.
GL_TRIANGLE_STRIP
Şu noktalar glBegin ve glEnd arasında çizdirilmiş olsun: p0, p1, p2, p3, p4, p5. p0, p1 ve p2'den bir üçgen oluşturulur ve sonraki her nokta için önceki iki nokta birleştirilerek bir üçgen daha oluşturulur. Yani p3 ile p1 ve p2 birleştirilir. Daha sonra p4 ile p3 ve p2, ... vs.
GL_QUAD_STRIP
GL_TRIANGLE_STRIP gibi çalışır, ama bu sefer verilen iki noktayı önceki iki nokta ile birleştirerek bir dörtgen oluşturur.
GL_TRIANGLE_FAN
p0, p1, p2, p3, p4, p5 verilmiş olsun. p0, p1 ve p2 üçgeni çizilir. Daha sonra p4 için p0 ve p3 birleştirilerek yeni üçgen elde edilir. p5 ile p4 ve p0 birleştirilir, ...vs. Böylece şekil yelpaze gibi olur.
void glEnd
()
işlev
glBegin() ile başlayan çizim işleminin bittiğini belirtir. Çizdirilen şekil ekrana yazılmak üzere saklanır; glFlush() ile ekrana yazılır.
void glFlush
()
işlev
Eğer çizilenler tamponlanmışsa, tampon bellekteki tüm şekillerin ekrana basılmasını sağlar.
Sadece yukarıdaki işlevleri kullanarak basit geometrik şekillerin iki boyutta çizimi mümkündür. Yukarıdaki glilk.c adlı program bu işlevlerden yararlanarak yazdığımız ilk OpenGL uygulamamızdır.
void glClearColor
(GLclampf kırmızı,
 GLclampf yeşil,
 GLclampf mavi,
 GLclampf donukluk)
işlev
glClear() işleviyle temizlenen ekran renk tamponunun ne renk alacağını belirler. Her parametre 0 ya da 1 değerini alır. Örneğin donukluk değeri 0 ise şeffaflık, 1 ise donukluk elde edilir. Öntanımlı değerlerin tümü 0'dır.
void glColor3s
(short kırmızı,
 short yeşil,
 short mavi)
işlev
Çizilecek şeklin rengini belirler. Öntanımlı değerlerin tümü 0'dır.
void glutInitWindowSize
(int genişlik,
 int yükseklik)
işlev
Oluşturulan pencerenin boyutlarını belirler. Pencere boyutlarının öntanımlı değeri (300, 300)'dür.
void glutInitWindowPosition
(int x,
 int y)
işlev
Pencerenin konumlanacağı yeri belirtir. Pencere yerinin öntanımlı değeri (-1, -1)'dir, böylece yerini pencere yöneticisi belirler.
void glLineWidth
(float genişlik)
işlev
Çizginin kalınlığını belirtir. Bu işlevle değiştirilmedikçe kalınlığın öntanımlı değeri 1.0'dır.
void glLineStipple
(int   çarpan,
 short örüntü)
işlev
Çizginin nokta nokta ya da düz çizgi şeklinde görünmesini ayarlar. Eğer örüntüdeki bit 0 ise bu bite karşı gelen benek ekrana basılmaz, eğer 1 ise ekrana basılır; Böylece kesik kesik çizgi çizilebilir.
Örnek:
glLineStipple(3, 0xcccc); /* 0xCCCC = 1100110011001100 */
Bu örnekte ikilik örüntü 3 ile genişletilmiştir. Bu işlevle, ekrandaki çizgiler 6 beneklik gruplara ayrılacak ve bir grup ekrana basılacak, bir grup basılmayacaktır.
void glEnable
()
işlev
void glDisable
()
işlev
Performans artışı sağlamak için OpenGL'deki kesiklililik, ışıklandırma, kaplama gibi özellikler glDisable() ile kapatılabilir. Böylece bu özellikler şeklin ekranda oluşturulması sırasında gözardı edilecek şekil daha hızlı ortaya çıkacaktır.
glEnable() özelliğin kullanılmasını sağlarken glDisable() kullanılmaz hale getirir. Örneğin:
glEnable(GL_LINE_STIPPLE); // kesikli çizgi çizebilmek için
glEnable(GL_SMOOTH);       // renk geçişlerini yumuşatmak için
void glRecti
(int x1,
 int y1,
 int x2,
 int y2)
işlev
İşlev, bir köşesi ilk iki parametresi ile çapraz köşesi ise son iki parametresi ile belirtilen bir dörtgenin çizilmesini sağlar.
İşlevin glRects, glRectf, glRectd türevleri de vardır. Tek farkları parametrelerinin sırasıyla short, float, ve double olmasıdır.
Dönüşümler
void glRotate
(double açı,
 double x,
 double y,
 double z)
işlev
Şekil, açı derece kadar koordinatları x, y, z ile belirtilen noktanın etrafında döndürülür.
void glTranslated
(double x,
 double y,
 double z)
işlev
Koordinatları x, y, z ile belirtilen noktaya koordinat sistemini öteler.
void gluOrtho2D
(double sol,
 double sağ,
 double alt,
 double üst)
işlev
İki boyutlu görüş peneresinin (clipping window) büyüklüğünü belirler.
void glLoadIdentity
()
işlev
Yapılmış tüm dönüşümlerin geri alınmasını sağlar.
void glScaled
(double x,
 double y,
 double z)
işlev
Bu dönüşüm sayesinde ölçekleme yapılır. Eğer girilen değerler 1'den küçükse nesneler küçültülür, 1'den büyükse nesneler büyütülür. Bu işlevin float parametreler alan glScalef isimli türevi de mevcuttur.
Olay Tanımlama İşlevleri
void glutReshapeFunc
(void (*işlev) (int    genişlik,
              double yükseklik)
işlev
Eğer pencere yeniden boyutlandırılırsa bu işlevin parametresi olan işlev çağrılır ve parametre olarak yeni genişlik ve yükseklik değerleri atanır.
void glutIdleFunc
(void (*işlev) (void)
işlev
Hiçbir olay oluşturulmadığında çalıştırılacak işlevi belirtir.
Artalanda Tamponlama
Her seferinde ekrandaki görüntünün tazelenmesi CRT (=Cathode Ray Tube) tarafından yapılır. Bu olaya programımız müdahale edemez. Bellekte OpenGL'in çizim için kullandığı ekran bölgesine nokta eklemek çizgi çizmek gibi işlemlerle değişiklik yaptıkça ekrana bu değişiklikler anında yansıtılır. Ama tüm değişikliklerin yapıldıktan sonra ekranın tazelenmesini sağlayacak bir yol da vardır.
Çizimi başka bir bellek bölgesinde yapıp sonra ekran bölgesine aktarabiliriz (double buffering). Arka planda ekranın yeni görüntüsü işlevlerle hazırlanır ve bu sırada ön planda yani kullanıcının gördüğü pencerede bir değişiklik olmaz. Biz programımızda glFlush() yerine glSwapBuffers() işlevini kullanırsak arka planda hazırladığımız değişiklikler ön plana yansır.
Bu durumu "ya hep ya hiç" şeklinde işlenmesi gereken verilere benzetebiliriz. Arka planda şeklin tamamı çizildikten sonra ön plana aktarılır. Böylece ekran tazelenmesi sırasında ekranın titrememesi sağlanır.
Ama artalanda tamponlama yapabilmek için penceremiz oluşturulmadan şu şekilde ilklendirme yapılması gerekmektedir:
glutInitDisplayMode (GLUT_RGBA | GLUT_DOUBLE);
GLUT_DOUBLE sayesinde çift tamponlu bir penceremiz olur. Artık glFlush() yerine glSwapBuffers() kullanılarak artalanda tamponlama yapılabilir.
Klavye ve Fare Kullanımı
Klavye İşlevleri
void glutKeyboardFunc
(void (*işlev) (char tuş,
              int  x,
              int  y)
işlev
Klavyeden bir tuşa basıldığında bu işlev çağrılır. x ve y farenin o andaki konumunu belirtir. tuş ise klavyede basılan tuşu belirtir.
void glutSpecialFunc
(void (*işlev) (int tuş,
              int x,
              int y)
işlev
Klavyedeki "F tuslarini" yani işlev tuşları için bu işlev kullanılır. Örnek:
  if(key == GLUT_KEY_F1){ printf("F1'e bastiniz.\n"); }
  else if(key == GLUT_KEY_UP) { printf("Yukari ok tusuna bastiniz.\n"); }
int glutGetModifiers
()
işlev
Herhangi bir tuşa basılmışken CTRL, ALT veya SHIFT tuşlarından birine basılıp basılmadığını bu işlev sayesinde öğrenebiliriz. Örneğin glutSpecialFunc işlevi tarafından çalıştırılan myFunction işlevi şöyle bir kod içerebilir:
void myFunction(void){
  int modifier;
  ...
  modifier = glutGetModifiers();
  if(modifier = GLUT_ACTIVE_SHIFT){ printf("SHIFT tusuna bastiniz."); }
  ...
}
İşlevden dönen değeri GLUT_ACTIVE_SHIFT, GLUT_ACTIVE_CTRL, GLUT_ACTIVE_ALT sabitleri ile bulabiliriz.
Fare İşlevleri
void glutMouseFunc
(void (*işlev) (int tuş,
              int durum,
              int x,
              int y)
işlev
Bu işlev farenin herhangi bir tuşuna basıldı veya bırakıldığı zaman calışır. x ve y farenin o andaki konumunu belirtir. tuş GLUT_LEFT_BUTTON, GLUT_RIGHT_BUTTON, GLUT_MIDDLE_BUTTON olarak tanımlanan sırasıyla sol, sağ ve orta fare tuşlarını belirtir. durum ise tuşun ne durumda olduğunu söyler. GLUT_UP, GLUT_DOWN sabitleriyle tanımlanır.
void glutMouseFunc
(void (*işlev) (int x,
              int y)
işlev
Tuş basılı olarak fare hareket ettiğinde çalışan işlevdir. Farenin o anki konumu x ve y parametrelerine atanır.
void glutPassiveMotionFunc
(void (*işlev) (int x,
              int y)
işlev
Herhangi bir tuşa basılmaksızın farenin hareket edişi sırasında çağrılan işlevdir. Farenin o anki konumu x ve y parametrelerine atanır.
void glutEntryFunc
(void (*işlev) (int durum)
işlev
Fare pencere sınırlarına girince veya sınırlarından çıkınca çağrılan işlevdir. durum parametresinin aldığı değere göre GLUT_ENTERED ile farenin pencereye girdiği, GLUT_LEFT ile farenin pencereden çıktığı anlaşılır.
Önceki Üst Ana Başlık Sonraki
Ne gerekir? Nasıl yapılır? Başlangıç Örnekler
Bir Linux Kitaplığı Sayfası