OpenGL - SABİS

advertisement
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
Download