Doç. Dr. Cemil Öz Bilgisayar Grafikleri Ders 9: OpenGL_1 SAÜ Bilgisayar Mühendisliği Dr. Cemil Öz OpenGL Nedir? OpenGL ya da tam adıyla Open Graphics Library (Açık Grafik Kütüphanesi), gelişmiş donanım desteğini kullanarak, hem iki hem de üç boyutlu grafikleri ekrana çizmek için kullanılan ücretsiz bir grafik arabirimidir. Bir programlama dili değildir. OpenGL grafik donanımı için tanımlanmış bir yazılım dır. Aynen Windows API larını bir dosyaya veya internete erişmek icin kullandığınız gibi OpenGL API da mesela bir oyun programı yazmak için aynı şekilde bir programlama dili tarafından kullanılır. OpenGL fonksiyon cağrılarına cevap veren bir yazılım kütüphanesi ya da bir donanım sürücüdür. 2 OpenGL Nedir? 300 den fazla komut ve fonksiyon bulunmaktadır. Bu komutlar nokta , çizgi , çokgen gibi temel grafik öğelerini 3 boyutta çizmeye yaramaktadır. Işıklandırma ve gölgeleme , doku kaplama , karıştırma (blending), yansıma. 3 OpenGL Nedir? OpenGL kitaplığı da ekrana grafik çizmeyi standartlawaştırmıştır. OpenGL sayesinde grafik kartının modeli veya işlemcinin mimarisi gibi donanımsal etkenlerden bağımsız programlama yapılır. Ayrıca aynı zamanda işletim sisteminden de bağımsız programlama yapılır. Kolay kullanım ve bu "taşınabilirlik" özellikleri yüzünden OpenGL popüler bir araç olmuştur. OpenGL içerisinde pencere yönetimi , kullanıcı girişleri veya dosya girdi/çıktı işlemlerine dair herhangi bir fonksiyon bulunmaz. Her programlama ortamı bunlar için kendi yordamlarına sahiptir ve bu ortam çizim işlemlerini OpenGL ye devretmekle yükümlüdür. 4 OpenGL Öncesi SGI (Silicon Graphics Inc.) firması OpenGL den önce IrisGL isimli API’yi üretti. Matris işlemlerini çok hızlı bir şekilde yapabilen bu API, yeteri kadar taşınabilir değildi. Farklı bilgisayarlarda ve işletim sistemlerinde sorun çıkardı. SGI, standart bir grafik uygulama geliştirme arabiriminin yokluğunu, 3D pazarının büyümesi için bir engel olarak gördü. Bunun üzerine bir standart geliştirdi ve 1992 yılında bir sonraki sürümünü olan OpenGL 1.0 ile bu sorunu ortadan kaldırdı. 5 OpenGL Lisans OpenGL’in fiyatı ne kadar? OpenGL bugün dünyada birçok yazılımcı tarafından kullanılmakta ve yazılımcılar bu API için hiçbir ücret ödememektedir. Peki, ama SGI - Khronos bu üründen nasıl para kazanmaktadır? Ekran kartı üreticileri eğer OpenGL destekli bir ekran kartı üretecek ise (bugün bütün ekran kartları destekliyor) SGI’ya bir telif ödemek zorundadır. Bu telif kapsamında SGI bu üreticilere gerekli sürücüleri sağlamakta ve ekran kartının performans testlerini yapmaktadır. 6 Neden OpenGL? Kitaplıktır Open Graphics Library, 2 veya 3 boyutlu grafik çizdirmek için kullanılan bir API’dir, bir başka deyişle kitaplıktır. Bu kitaplık yazılım geliştiricilere grafik donanımını yönetme şansı verir. Taşınabilirdir (donanım-bağımsız) İşletim sisteminden ve işletim sisteminin çalıştığı platformdan bağımsızdır. Grafik kartının modeli veya işlemcinin mimarisi gibi donanımsal etkenlerden bağımsız programlama yapılır. 7 Neden OpenGL? İşletim sisteminden bağımsızdır OpenGL çalışma anı kitaplığı (run-time library) Windows 95/98/NT/2000/XP, Linux, Unix, Mac OS, OS/2, OPENStep ve BeOS işletim sistemlerinde vardır. Windows ailesinde standart olarak gelir. Pencere yöneticisinden bağımsızdır OpenGL kullanılarak yazılmış programlar, Win32, MacOS ve X-Window pencere yöneticilerinde sorunsuz çalışırlar. 8 Neden OpenGL? Birçok programlama dilinde kullanılabilir Ada, C, C++, C# (SharpGL adı verilen sınıflar sayesinde), Fortran, Python, Perl ve Java programlama dilleri kullanılarak OpenGL kitaplığından faydalanılabilir. Yüksek seviye komutlar içermez OpenGL'de yalnızca en temel nesneler (nokta, çizgi, çokgen) bulunur. Bunlarla kompleks modeller (molekül, uçak, ev, araba vb.) oluşturulur. 9 GLUT Nedir? GLUT : OpenGL Utility Toolkit OpenGL Araç Kiti İşletim sistemine aktarılmış bir kitaplıktır. Amacı OpenGL uygulamaları için pencere yöneticisinden bağımsız bir arabirim eksiğini gidermektir (taşınabilirlik) Örn : pencereler oluşturmak, klavye ve fareden veri almak vb. 10 OpenGL platformdan bağımsız olduğu için bazı işlemler bu kitaplık ile yapılamaz. Örneğin kullanıcıdan veri almak, bir pencere çizdirmek gibi işler hep kullanılan pencere yöneticisi ve işletim sistemine bağlıdir. Bu yüzden bir an için OpenGL'in bu durumlarda platforma bağımlı olduğunu düşünebiliriz. Çünkü penceresini her pencere yöneticisinde farklı çizdirecek bir canlandırma programı yazmak demek her bilgisayarda çalışacak ayrı pencere açma kodu yazmak demektir. Bu ise OpenGL'in doğasına aykırıdır. Neyse ki OpenGL Araç Kiti (GLUT - OpenGL Utility Toolkit) var da yazılım geliştiricileri bir platforma bağlılıktan tamamen kurtarıyor. GLUT, birçok işletim sistemine aktarılmış bir kitaplıktır. Amacı OpenGL programlarının pencerelerini oluşturmak, klavye ve fareden veri almak gibi ihtiyaçlarını karşılamaktır. GLUT olmadan da OpenGL programlama yapılabilir, örneğin Linux'ta kullanılan X-Window sistemin kendi işlevleri kullanılarak pencere çizdirilebilir fakat bu kod sadece X-Window'da çalışır. Kod Windows'a götürülüp derlendiğinde çalışmaz, çünkü Windows'da X-Window işlevleri yoktur OpenGL nasıl çalışır? 13 Yazılım bazında rol alan OpenGL mimarisi yukarıdaki yapıya sahiptir.Tipik bir program birçok çağrıda bulunur.Bunlardan bir kısmı programcı , bir kısmı işletim sistemi ve bir kısmı da programlama dilinin kendi kütüphaneleri tarafından yapılmaktadır.Windows uygulamaları , çıktıları ekranda göstermek için Grafik Cihaz arayüzü denilen bir Windows API kullanırlar.Bu GCA(İngilizce de GDI) , pencereye yazılar yazmak , çizgiler çizmek için kullanılır.Genellikle grafik kart üreticileri GCA nın çıktı üretmek için etkileştikleri bir grafik sürücüsünü de kart ile birlikte verirler.İşte oyun oynarken bazılarınızda , grafik kartlarının problem çıkarmasının sebeplerinden biri de GCA ile kullandığınız sürücünün uyuşmaması üzerine ortaya çıkar.OpenGL nin yazılım tanımlaması ki bunu ileride siz yapacaksınız , grafik isteklerini bir uygulamadan alarak , 3 boyutlu grafiklerin renkli bir görüntüsünü oluşturur.Bu görüntünün oluşturulmasından sonra onu GCA ya vererek monitöre yansıtılmasını sağlar.Windows dışındaki işletim sistemlerinde de benzer durumlar söz konusudur ancak onlarda GCA nın yerini o işletim sistemine özgü grafik servisi almaktadır. OpenGL Boru hattı Boru hattı (Pipeline) iki veya daha fazla değişik aşma gerektiren işlemler için kullanılan bir tarif biçimidir. Aşağıdaki şekilde bir OpenGL işletimi için kullanılan boru hattı gösterilmektedir. Bir uygulama OpenGL fonksiyon çağrıları yaparken istekler bir komut tamponuna konur. Bu tampon komutlarla, grafik bilgileri, doku bilgileri ve buna benzer bilgiler ile dolar. Tampon temizlenince programcı veya grafik sürücüsünün mimarisine bağlı olarak komutlar bir sonraki aşamaya geçerler. OpenGL nasıl çalışır? OpenGL API Çağrıları OpenGL Komut Tamponnu Dönüştürme/ Aydınlatma Grafik İnşası Görüntü Tamponu 16 OpenGL 1.0 1992 (OpenGL1.0) Silicon Graphics Eski ekran kartları ile çalışmaz, mutlaka 3D özelliği olan bir kart gerekir. DirectX ise çok eski kartlarla da çalışmasına rağmen program hangi versiyonda yazıldı ise kullanıcı da directX'in o versiyonunu bilgisayarına yüklemek zorundadır. 17 Grafik bilgileri ilk başta uygun forma dönüştürülüp ışıklandırılır. Bu işlem matematiksel olarak yoğun işlemlerin kullanıldığı ve grafik bilgilerinin kullanılarak objenin yeri ve durumu bilgilerinin alınıp görüntüde tekrar çizilme işlemidir. Işıklandırma ise objeye her yönden verilen ışık ile objenin nasıl görüneceğinin belirlendiği kısımdır. Önceki aşama tamamlandığında bilgi inşaa bölümüne yüklenir. Geometrik,renk ve doku bilgilerini alınması ve renkli görüntünün oluşması bu aşamada gerçekleştirilir. Bundan sonra işlenen görüntü görüntü tamponuna(frame buffer) gönderilir. Görüntü tamponu aslen ekran kartının hafızasıdır. İşte yine birçoğunuzun 3D oyunlar oynarken karşılaştığı frame(görüntü karesi) tabiri bu anlama gelmektedir. Görüntü kartının hafıza büyüklüğü ne kadar faal görüntü karesini tutabilecegi , işlemci gücü ise bunları ne kadar hızlı işleyebileceği anlamına gelmektedir.Kısaca daha güçlü görüntü kartı daha akışkan ve ayrıntılı görüntü almanız demektir. Donanım hızlandırması Interaktif 3 boyutlu grafik uygulamalari en hizli islemcilerde bile oldukça zaman harcayan bir işlemdir.Bu sebeple grafik kartı üreticileri kartlarını, üzerinde grafik hızlandırıcılar bulundurmaya başlamıştır.Bu kartlar üzerlerinde 3 boyutlu grafik üretmek için özelleştirilmiş işlemciler taşirlar.Genel amaçli CPU ların tersine bu işlemciler 3D işlemlerini önemli ölçüde hızlandıracak şekilde tasarlanmıslardır.Eger bahsettiğimiz OpenGL ithalat kütüphanelerini programınıza bağlarsanız programlarınız bilgisayarınızda bulunan 3D kartının üzerinde Windows tarafından kullanılan sürücüyü otomatik olarak kullanmaya baslayacaktır(Cogunlukla).İste bu kütüphaneleri ekleme sebebimiz budur. OpenGL veri tipleri Bir platformdan digerine rahatca gecis yapabilmek icin OpenGL kendi özgün veri tiplerini tanımlamaktadır.Bu veri tiplerinin isterseniz gerçek C veri tiplerine dönüştürebilirsiniz.Fakat varolan derleyicilerin her birinin C deki veri tipleri icin kendi belirlediği kurallar ve hafıza kısıtlamaları bulunmaktadır. OpnGL veri tiplerini kullanarak bu kısıtlamaların önüne geçmeniz mümkündür. Tüm veri tipleri OpenGL yi belirtmek icin GL ile başlamaktadir.Bazılarında işaretsiz tipi belirtmek icin u kullanilmaktadir.Bir boyutu veya renk derinligi gibi kavramlari belirtmek icin kullanilan degiskenlerde genellikle size adi verilen ozel taki kullanilmaktadir.Mesela GLsizei bir tamsayi tarafindan belritilen boyut parametresini tanimlar.Clamp takisi renk butunlugunu tanimlamak icin kullanilir ve rengin siddetini belirtir.boolean true ve false degerlerini tutmak icin(mesela isigin varligi ve yoklugu) num enumerated adi verilen ve veri kümesi tutan ve son olarak bitfield ikilik bit alanlarini tutmaya yarayan degiskenlerdir. Bu baglamda isaretci ve dizi kavramlari farkli tutulmamaktadir.Benzer sekilde 10 luk bir GLshort dizisi GLshort shorts[10]; seklinde ve 10 luk bir GLdouble veri tipi isaretcileri dizisi GLdouble *doubles[10]; seklinde tanimlanmaktadir. OpenGL 3.0 Khronos Grubu, OpenGL API'de, “Long Peaks” kod adlı üçüncü sürümünü yayınladı. (11.08.2008) Yeni sürüm eski donanımları desteklemekle birlikte birçok yeni özellik de barındırıyor. OpenGL ve OpenCL birlikteliği. 25 OpenGL 3.0 yenilikler Kolay programlamayı sağlamak için vertex dizi durumlarını kapsayacak Vertex Array Nesneleri Gelişmiş performans için alt-dizileri düzenlemeyi de sağlayan tam Vertex Buffer Nesneleri erişimi Pek çok buffer seçeneğinin kullanımını sağlayacak tam framebuffer nesne fonksiyonları OpenGL uygulamalarında ekranın gama düzeltme seçeneğine bağlı kalmaksızın düzgün renk oluşturulmasını sağlamak için sRGB framebuffer'ına kaplama ve blend etme. 26 OpenGL 3.0 yenilikler Görsel ve sayısal işlemlerde, duyarlılık ve dinamik range'i artırmak için 32-Bit kayar nokta doku ve kaplama buffer'ları. Vertex dönüştürme sonucu oluşan geometrik veriyi yakalamak için dönüşüm geri beslemesi. OpenGL 3.0 eksiler DirectX 11 ile karşılaştırıldığında 3.0 sürümü ihtiyaçları karşılayamıyor Toplulukla hiçbir bilgi paylaşımı yok 27 OpenGL - Windows opengl32.dll glu32.dll glut32.dll opengl32.lib glu32.lib glut32.lib gl.h windows sistem klasörü içinde windows sistem klasörü içinde windows sistem klasörü içinde kütüphane dizini içinde (lib) kütüphane dizini içinde (lib) kütüphane dizini içinde (lib) include dizini içinde glu.h include dizini içinde glut.h include \GL dizini içinde 28 Fonksiyonlar 29 Fonksiyonlar Void gluPerspective (Gldouble angle, Gldouble aspect, Gldouble zNear, Gldouble zFar) : Görüntümüze perspektiflik (uzaklık arttıkça cisimlerin küçülmesi) kazandırır. Void glTranslatef (TYPE x, TYPE y, TYPE z) : Oluşturulan nesnenin başlangıç koordinatlarını belirler Void glBegin (GLenum mode) : Geometrik primitifi tanımlayan köşe noktaları (vertex) listesinin başlangıcını belirler. Void glColorf (TYPE r, TYPE g, TYPE b) : Mevcut köşenin rengini belirler. Void glEnd (void) : Köşe listesinin (vertex list) sonunu belirler. 30 Fonksiyonlar Void glClearColor (Glfloat red, Glfloat green, Glfloat blue, Glfloat alpha) : RGB modunda, kırmızı, yeşil, mavi renk bileşenlerini kullanarak mevcut artalan rengini belirler. [0,1] aralığında değer alırlar. Void glClearDepth (Glfloat depth) : Derinlik tamponundaki başlangıç değerlerinin ne olacağı belirlenir. Void glClear (Glbitfield mask) : Belirtilen tamponları sıfırlar. Void glRotatef (TYPE angle, TYPE x, TYPE y, TYPE z) : Orjin ve (x,y,z) noktalarından geçen eksen etrafında, angle parametresinin tanımladığı açı kadar saat ibresi yönünde döndürülür. 31 Fonksiyonlar (glut) void glutInit(int argc, char **argv) : GLUT kütüphanesini kullanmaya başlamadan önce ilk olarak glutInit isimli yordam çağırılmalıdır void glutInitWindowSize(int w, int h) : pencere büyüklüğünü belirler void glutInitDisplayMode(unsigned int mode) : pencere görüntüleme şeklini belirler int glutCreateWindow(char *t) : pencere oluşturma void glutDisplayFunc(void (*func)(void)) : pencereye bir şeyler çizilme zamanı geldiği sırada GLUT sistemi tarafından otomatik olarak çağırılmasını sağlama ve fonksiyon ismini GLUT sistemine kaydetme 32