Title: OpenGL Programlamaya Giris
1OpenGL Programlamaya Giris
- Yrd. Doç. Dr. Altan Mesut
2Konular
- OpenGLin ve kullanim alanlarinin tanitimi
- OpenGLin yeteneklerinin ve özelliklerinin
gösterimi ve tanitilmasi - Etkilesimli bir 3 boyutlu grafik programinin
OpenGL ile yazilmasi
3Ilgili WEB siteleri
- http//www.opengl.org/
- http//www.opengl.org/resources/libraries/glut/
- http//www.opengl.org/wiki/Code_Resources
- http//www.khronos.org/opengl/
4OpenGL nedir?
- OpenGL bilgisayar grafigi çizmek için bir APIdir
- Temel geometrik sekiller ve görüntüler ile yüksek
kalitede renkli görüntüler olusturur - 3 boyutlu grafikler ile etkilesimi uygulamalar
yaratir - Isletim sisteminden ve pencere sisteminden
bagimsizdir
5Ilgili kütüphaneler (APIler)
- GLU (OpenGL Utility Library)
- OpenGLin bir parçasidir
- Egriler, yüzeyler, yüzey döseme görüntüleri,
içerir. - AGL, GLX, WGL
- OpenGL ile pencere sistemleri arasindaki
katmandir - GLUT (OpenGL Utility Toolkit)
- Daha yalin bir pencere sistemi bütünlestirmesi
sunar - Resmi anlamda OpenGLin parçasi degildir
6OpenGL ve ilgili APIler
7Basit Bir Program
- Siyah bir arka plan üzerine beyaz bir kare çizer.
8simple.c
include ltGL/glut.hgt void mydisplay()
glClear(GL_COLOR_BUFFER_BIT) glBegin(GL_POLYGO
N) glVertex2f(-0.5, -0.5)
glVertex2f(-0.5, 0.5)
glVertex2f(0.5, 0.5)
glVertex2f(0.5, -0.5) glEnd() glFlush()
int main(int argc, char argv) glutCreateW
indow("simple") glutDisplayFunc(mydisplay)
glutMainLoop()
9Olay Döngüsü
- Her GLUT programi bir gösterim fonksiyonu içerir.
Bizim programimizda da mydisplay adinda bir
gösterim fonksiyonu vardir. - Görüntünün tazelenmesini gerektiren bir olay
oldugunda (mesela pencere açildiginda) gösterim
fonksiyonu çagrilir. - Ana fonksiyon (main) programin bir olay döngüsüne
girmesi ile son bulur.
10OpenGL Programinin Genel Yapisi
Bir pencere yapilandir ve aç
OpenGL durumu baslat
Kullanici olaylarini isle
Görüntüyü çiz
11Bir OpenGL Programi
- include ltGL/glut.hgt
- include "cube.h"
- void main( int argc, char argv )
-
- glutInit( argc, argv )
- glutInitDisplayMode( GLUT_RGBA
- GLUT_DEPTH )
- glutCreateWindow( argv0 )
- init()
- glutDisplayFunc( display )
- glutReshapeFunc( reshape )
- glutMainLoop()
Programin main bölümünde OpenGL penceresini
açmak ve kullanicidan girdi almak için GLUT
kullanilir.
12Bir OpenGL Programi (devam)
- void init( void )
-
- glClearColor( 0, 0, 0, 1 )
- gluLookAt( 2, 2, 2, 0, 0, 0, 0, 1, 0 )
- glEnable( GL_DEPTH_TEST )
-
- void reshape( int width, int height )
-
- glViewport( 0, 0, width, height )
- glMatrixMode( GL_PROJECTION )
- glLoadIdentity()
- gluPerspective( 60, (GLfloat) width / height,
- 1.0, 10.0 )
- glMatrixMode( GL_MODELVIEW )
-
Bir baslangiç OpenGL durumu yapilandirilir.
Kullanici pencere boyutunu degistirdiginde
kullanilir.
13Bir OpenGL Programi (devam)
- void display( void )
-
- int i, j
- glClear( GL_COLOR_BUFFER_BIT
GL_DEPTH_BUFFER_BIT ) -
- glBegin( GL_QUADS )
- for ( i 0 i lt NUM_CUBE_FACES i )
- glColor3fv( faceColori )
- for ( j 0 j lt NUM_VERTICES_PER_FACE j )
- glVertex3fv( vertexfaceij )
-
-
- glEnd()
- glFlush()
OpenGL3D noktalardan(vertices) bir küp çizer.
14OpenGL Komut Biçimi
glVertex3fv( v )
kütüphane
Veri Tipi
Vektör
b - byte ub - unsigned byte s - short us -
unsigned short i - int ui - unsigned int f -
float d - double
skalar düzende v yer almaz glVertex2f( x, y )
Bilesen Sayisi
2 - (x,y) 3 - (x,y,z) 4 - (x,y,z,w)
15Programlarda neler gerekli?
- Header Dosyalar
- include ltGL/gl.hgt
- include ltGL/glu.hgt
- include ltGL/glut.hgt
- Kütüphaneler
- opengl32.lib, glut.lib, glut32.lib
- Veri Tipleri (uyumluluk için)
- GLfloat, GLint, GLenum,
16GLUT Callback Fonksiyonlari
- Bir olay gerçeklestiginde çagrilacak rutin
- Pencere büyüklügü degisimi
- Kullanici girisi
- Animasyon
- GLUT ile callbacklerin kaydedilmesi
- glutDisplayFunc( display )
- glutIdleFunc( idle )
- glutKeyboardFunc( keyboard )
17OpenGL neleri çizebilir?
- Temel geometrik sekiller
- noktalar, çizgiler ve çokgenler
- Temel resimler (image)
- Resim ve bitmapler
- Resim ve geometri için farkli islem hatti var
- doku kaplamasi sirasinda birbirine baglanir
- Duruma bagli çizimler
- renkler, materyaller, isik kaynaklari, ...
s11-Fig1.2
18OpenGL Geometrik Sekilleri
- Tüm geometrik sekiller köse noktalari ile
belirlenir
GL_POINTS
GL_POLYGON
GL_LINE_STRIP
GL_LINES
GL_LINE_LOOP
19Bir Geometrik Sekli Tanimlama
- Temel sekiller asagidaki iki fonksiyon ile
tanimlanir - glBegin( sekilTipi )
- glEnd()
- sekilTipi noktalarin nasil bir araya
getirilecegini belirler
glBegin( sekilTipi ) for ( i 0 i lt n i )
glColor3f( redi, greeni, bluei )
glVertex3fv( coordsi ) glEnd()
20OpenGL Nasil Çalisir?
21OpenGLin Çizimini Kontrol Etme
- OpenGLin çizim durumunu (state) tanimlama
- Durum, nesnelerin nasil çizilecegini belirleyen
degerler kümesidir. - Mavi bir üçgen çizilecekse, önce mavi renk
glColor fonksiyonu ile ayarlanir, sonra çizgiler
glVertex ile olusturulur. - gölgelendirme isik
- doku kaplama çizgi stilleri (stipples)
- çokgen kaliplari seffaflik
22OpenGL durum kontrolünün gücü
Görünüm OpenGLin durumunu tanimlamakla kontrol
edilir.
23OpenGLin Durumunu Tanimlama
- OpenGLin durumunu tanimlamak için 3 yöntem
vardir - Noktalari islemek için kullanilan degerleri
tanimlama - Durumu tanimlamanin en genel yöntemleri
- glColor() / glIndex()
- glNormal()
- glTexCoord()
- Durum glVertex() ten önce tanimlanmalidir.
24OpenGLin Durumunu Tanimlama
- Bir çizim biçimini açma
- glEnable() / glDisable()
- Belirli bir çizim biçiminin özelliklerini
tanimlama - Her biçim kendi degerlerini tanimlamak için özel
komutlar içerir. - glMaterialfv()
25OpenGLde Renk Modeli
- OpenGL RGB renk uzayini kullanir
- Sirali renk (indexed color) biçimi de vardir, ama
pek kullanilmaz - Renkler 0.0, 1.0 araligindaki ondalikli
sayilar ile veya 0,255 araligindaki tamsayilar
ile temsil edilirler - Örnegin pencerenin arka plan rengini belirlemek
için asagidaki fonksiyon kullanilabilir - glClearColor( 1.0, 0.3, 0.6, 1.0 )
- glColor3ub( 240, 130, 100 )
26Genisletilmis simple.c
- Çikti ayni olacak, fakat tüm ilgili durum
degerleri tanimlanacak. - Tanimlanan degerler
- Renkler
- Görüntüleme kosullari
- Pencere özellikleri
27gl.h ve glu.h da glut.h ile eklenir
- include ltGL/glut.hgt
- int main(int argc, char argv)
-
- glutInit(argc,argv)
- glutInitDisplayMode(GLUT_SINGLEGLUT_RGB)
- glutInitWindowSize(500,500)
- glutInitWindowPosition(0,0)
- glutCreateWindow("simple")
- glutDisplayFunc(mydisplay)
-
- init()
-
- glutMainLoop()
Pencere özellikleri tanimlandi
Görüntüleme callback fonksiyonu
OpenGL durumu tanimlandi
Olay döngüsüne giris
28GLUT fonksiyonlari
- glutInit uygulamanin komut satirindan bilgi
almasini ve sistemi baslatmasini saglar - gluInitDisplayMode pencere için çizim
özelliklerini belirler. Örnegimizde seçilen
degerler - RGB renk biçimi
- Tekli tampon biçimi
- glutWindowSize piksel olarak pencere boyutu
- glutWindowPosition ekranin sol üst kösesinden
uzakligi - glutCreateWindow simple adindaki pencerenin
yaratilmasi - glutDisplayFunc görüntüleme callback fonksiyonu
- glutMainLoop sonsuz olay döngüsüne giris
29- void init()
-
- glClearColor (0.0, 0.0, 0.0, 1.0)
- glColor3f(1.0, 1.0, 1.0)
- glMatrixMode (GL_PROJECTION)
- glLoadIdentity ()
- glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0)
Siyah arka plan rengi
Mat pencere
Beyaz ile çizme veya doldurma
Görünüm biçimi
30Sekiller Uygulamasi
31Dönüsümler
323D Görüntüleme Fotograf Çekme
- 3 boyutlu görüntüleme fotograf çekmeye benzer.
- Objenin konumlandirilmasi (modeling)
- Kameranin yerlestirilmesi (viewing)
- Lens seçimi (projection)
- Görüs alani (viewport)
görüs alani
kamera
model
tripod
33Koordinat Sistemleri ve Dönüsümler
- Görüntüyü olusturma adimlari
- Geometriyi belirleme (dünya koordinatlari)
- Kamerayi belirleme (kamera koordinatlari)
- Görüntüleme biçimini belirleme (pencere
koordinatlari) - Görüs alanina esleme (ekran koordinatlari)
- Bütün adimlarda dönüsümler kullanilabilir.
- Her dönüsüm koordinat sistemlerinde bir degisime
denk gelir.
34Homojen Koordinatlar
- Her vertex (köse noktasi) bir vektördür (kolon).
- w genellikle 1dir.
- Tüm dönüsüm islemleri matris çarpimlari ile
yapilir.
353D Dönüsümler
- Noktalar 4 x 4 boyutunda matrisler ile çarpilarak
dönüstürülürler - Tüm matrisler sütun-öncelikli olarak
kaydedilirler - En son tanimlanan matris en önce çarpilandir
(dönüsüm matrisi solda, vertex matrisi sagda) - Matrisin gösterimi
36Dönüsümleri Belirleme
- Dönüsümler iki farkli yöntem ile belirlenebilir
- Matrisleri belirleyerek
- glLoadMatrix, glMultMatrix
- Islemi belirleyerek
- glRotate, glOrtho
- Programci gerçek matrisin ne oldugunu bilmek
zorunda degildir.
37Dönüsümleri Programlama
- Kameranin pozisyonu ve cisimlerin 3D geometrisi
ile ilgili çizme, görüntüleme, konumlandirma ve
yönlendirme islemlerinden önce matrislerin hangi
islem için düzenlenecegi belirtilmelidir - glMatrixMode(GL_PROJECTION)
- Dönüsümler ilgili sirada bir araya getirilir.
Artarda yazilan dönüsümler son yazilandan ilk
yazilana dogru gerçeklestirilir.
38Matris Islemleri
- Matris yiginini (stack) belirleme
- glMatrixMode(GL_MODELVIEW veya GL_PROJECTION)
- Diger Matris veya Yigin Islemleri
- glLoadIdentity() glPushMatrix()
- glPopMatrix()
- Viewport
- Genellikle pencere genisligi ile aynidir
- Eger viewport genislik/yükseklik orani
projeksiyondakinden farkli ise nesneler
olduklarindan farkli biçimde görünebilirler (daha
genis, daha yüksek, ) - glViewport( x, y, genislik, yükseklik )
39Projeksiyon Dönüsümü
- Perspektif izdüsümde (projeksiyon)
- görünüm uzayi frustum adi verilen
- kesik piramit gibidir.
- Perspektif izdüsüm
- gluPerspective( fovy, aspect, zNear, zFar )
- glFrustum( left, right, bottom, top, zNear, zFar
) - Orthografik parallel izdüsüm
- glOrtho(left, right, bottom, top, zNear, zFar)
- gluOrtho2D( left, right, bottom, top )
- calls glOrtho with z values near zero
40Izdüsüm Dönüsümlerini Uygulamak
- Orthografik izdüsüm için tipik kullanim örnegi
- glMatrixMode( GL_PROJECTION )
- glLoadIdentity()
- glOrtho(left, right, bottom, top, zNear, zFar)
41Dönüsümleri Görmek
- Kamerayi konumlandirma
- Kamera ayagini aç ve kamerayi yerlestir
- Bir sahnede hareket etmek için
- Görüntüleme dönüsümünü degistir ve sahneyi tekrar
çiz - gluLookAt( eyex, eyey, eyez, aimx,
aimy, aimz, upx, upy, upz ) - Yukari (up) vektör kameranin üstünün neresi
oldugunu belirler
42Izdüsüm Uygulamasi
43Konumlandirma Dönüsümlerini Uygulamak
- Nesneyi tasimak
- glTranslatefd( x, y, z )
- Nesneyi bir eksen etrafinda döndürmek
- glRotatefd( açi, x, y, z )
- Açi derece cinsinden girilir
- Nesneyi büyütmek/küçültmek, genisletmek/daraltmak
ve yansimasini olusturmak - glScalefd( x, y, z )
44Dönüsüm Uygulamasi
45Kamera yeri ve konumlandirma arasindaki iliski
- Kamerayi belirli bir dogrultuda tasima ile
görüntülenen dünyadaki tüm nesneleri tam tersi
olan dogrultuda tasima arasinda bir fark yoktur. - Görüntüleme dönüsümleri birçok konumlandirma
dönüsümüne esittir. - gluLookAt() komutunun yaptigi isi birçok
glTranslate ve glRotate kombinasyonu ile
yapabilirsiniz.
46Konumlandirma Dönüsümlerini Beraber Kullanma
- Problem Hiyerarsik Nesneler
- Bir pozisyon bir önceki pozisyona bagli
- Robot kolu veya el gibi birlesik yapilar
- Çözüm
- Sütun-öncelikli matrisler ilgili sirada
çarpilmalidir - Tasimayi takip eden döndürme ile döndürmeyi takip
eden tasima ayni sonucu vermez - Matris çarpimi sira-bagimli bir islemdir.
47Konumlandirma Dönüsümlerini Beraber Kullanma
- Problem Nesne görüntülenen dünyanin merkezine
göre konumlanir - Nesneyi kendi etrafinda döndürmek isterken baska
bir eksen etrafinda dönüyor - Çözüm sabit koordinat sistemi
- Konumlandirma dönüsümlerinden önce nesneyi
merkeze tasi - Istenilen döndürmeyi yaptiktan sonra önceki
tasimanin tersi ile tekrar eski noktaya tasi
48Animasyon ve Derinlik Tamponu
49Çift Tampon
50Animasyon
- Çift renk tamponu kullanimi istegi yapilir
- glutInitDisplayMode( GLUT_RGB GLUT_DOUBLE )
- Renk tamponu temizlenir
- glClear( GL_COLOR_BUFFER_BIT )
- Sahne çizimi yapilir
- Ön ve arka tamponlar yer degistirilir
- glutSwapBuffers()
- 2, 3 ve 4. adimlar tekrar edilerek animasyon
saglanir - glutIdleFunc() callback kullanilir
51Derinlik Tamponu veSakli Yüzeylerin Atilmasi
1
1
2
2
4
4
Renk Tamponu
Derinlik Tamponu
8
8
16
16
Görüntü
52Derinlik Tamponu Kullanimi
- Derinlik tamponu kullanimi istegi yapilir
- glutInitDisplayMode( GLUT_RGB GLUT_DOUBLE
GLUT_DEPTH ) - Özellik aktif hale getirilir
- glEnable( GL_DEPTH_TEST )
- Renk ve derinlik tamponlari temizlenir
- glClear( GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT
) - Sahne çizilir
- Renk tamponlari yer degistirilir
53Isiklandirma
54Isiklandirma Ilkeleri
- Isiklandirma isleminde nesnelerin isigi nasil
yansitacagi belirlenir. - Etki eden faktörler
- Nesnelerin malzeme bilesimi
- Isigin rengi ve yönü
- Evrensel isiklandirma parametreleri
- Çevresel isil
- Iki yönlü isik
- Hem color index hem de RGBA biçimlerinde çalisir
55OpenGL isigi nasil kullanir
- OpenGLde isiklandirma Phong isiklandirma
modeline dayanir. Çizim ilkelinin her noktasinda,
bir renk o ilkelin malzeme özelliklerinin isik
ayarlari ile birlikte kullanilmasi ile
hesaplanir. - Bir noktanin isik altindaki rengini bulmak için,
o noktaya verilen renk haricinde 4 bilesenin daha
bilinmesine gerek vardir. Bunlar - Ambient
- Diffuse
- Specular
- Emmission
56Isigin Bilesenleri
- Ambient Hangi noktadan geldigi tam olarak
belirlenemeyen (tüm yönlerden geliyormus gibi
görünen) çevresel isik bilesenidir. - Diffuse Tek bir noktadan gelen isik bilesenidir.
- Specular Belirli bir noktadan gelen ve parlak
yüzeyli nesnelerde yansima yapan isik
bilesenidir. - Emission Isik yayan yüzeylerdeki isik
bilesenidir. Isik sanki nesnenin içinde parliyor
gibi algilanir.
57Yüzey Normalleri
- Normaller bir yüzeyin isigi nasil yansitacagini
belirler - glNormal3f( x, y, z )
- Geçerli olan normal vektörü vertexin renginin
hesaplanmasinda kullanilir. - Normallerin otomatik olarak ayarlanmasi için
- glEnable( GL_NORMALIZE )veya düzgün olmayan
ölçeklemelerde - glEnable( GL_RESCALE_NORMAL )
- kullanilir.
58Malzeme Özellikleri
- Yüzey özelliklerini belirleyen fonksiyon
- glMaterialfv( yüzey, özellik, deger )
- Ön ve arka yüzeyde farkli malzeme kullanilmis
olabilir - GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
GL_DIFFUSE Temel renk
GL_SPECULAR Yansima noktasindaki renk
GL_AMBIENT Nesnenin direkt isik almadigi zamanki rengi
GL_EMISSION Nesnenin yaydigi isigin rengi
GL_SHININESS Isigi yansitma degeri (0-128)
59Isik Kaynaklari
- glLightfv( isik, özellik, deger )
- isik parametresi n farkli isik degerinden birini
alir - GL_LIGHT0 GL_LIGHTn
- glGetIntegerv( GL_MAX_LIGHTS, n )
- özellikler
- Renkler (GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR)
- Yer (GL_POSITION)
- Tip (GL_SPOT_...)
- Zayiflama (GL_..._ATTENUATION)
60Isik Tipleri
- OpenGL iki farkli isik tipi saglar
- Lokal (Nokta) isik kaynaklari
- Sonsuz (Dogrusal) isik kaynaklari
- Isik tipi w koordinati ile belirlenir
61Isiklari Aktif Hale Getirme
- Isiklandirmayi açma
- glEnable( GL_LIGHTING )
- Isik kaynaginin dügmesini açma
- glEnable( GL_LIGHTn )
62Isik Malzeme Uygulamasi
63Isigin yer ve yön kontrolü
- Modelview matrisindeki degisim isigin yönünü de
etkiler - Isigin ne zaman tanimlandigina göre farklilik
gösterir - göz koordinatlari (isik hep ayni noktadan
geliyor günes) - dünya koordinatlari (sahnede sabit isik
kaynaklari var lamba) - model koordinatlari (hareketli isik el feneri
araba fari) - Isigin yerini kontrol etmek için matrisler push
ve pop edilebilir.
64Isik Yönü Uygulamasi
65Spot Isik
- Isigin etkisini merkezilestirir
- GL_SPOT_DIRECTION
- GL_SPOT_CUTOFF
- GL_SPOT_EXPONENT
66Isigin Mesafe ile Zayiflamasi
- Mesafe arttikça isik yogunlugu azalir.
- Bu özellik kullanilirsa gerçeklik artar.
- GL_CONSTANT_ATTENUATION
- GL_LINEAR_ATTENUATION
- GL_QUADRATIC_ATTENUATION
67Isik Modeli Özellikleri
- glLightModelfv( özellik, deger )
- Iki yönlü isiklandirma saglamak için
- GL_LIGHT_MODEL_TWO_SIDE,0.2, 0.2, 0.2, 1.0
- Evrensel bir çevresel isik rengi vermek için
- GL_LIGHT_MODEL_AMBIENT, GL_FALSE (GL_TRUE)
- Viewpoint degistikçe isigin etkisinin de
degismesi - GL_LIGHT_MODEL_LOCAL_VIEWER, GL_FALSE (GL_TRUE)
- Doku kaplamada daha iyi renk kontrolü için
- GL_LIGHT_MODEL_COLOR_CONTROL, GL_SINGLE_COLOR
- (GL_SEPARATE_SPECULAR_COLOR)
68Isigi iyi kullanmak için
- Modeldeki ayrintinin çoklugunun isik islemlerini
de yavaslatacagi unutulmamalidir. - Hizli isiklandirma için tek bir sonsuz isik
kaynagi kullanilmalidir. - Vertex basina en düsük hesaplama
69Görüntüleme Listeleri
70Dogrudan çizim yerine Görüntüleme Listeleri ile
çizim
- Dogrudan çizim
- Çizim ilkelleri çizim hattina gönderilerek direkt
olarak çizilir - Çizilenler hafizada kalici degildir
- Görüntüleme Listeleri ile çizim
- Çizim ilkelleri görüntüleme listelerine
yerlestirilir - Görüntüleme listeleri grafik sunucusunda tutulur
- Farkli bir sekilde tekrar çizim yapilabilir
- OpenGL grafik ortamlari tarafindan paylasilabilir
71Dogrudan çizim yerine Görüntüleme Listeleri ile
çizim
Dogrudan Çizim
Vektör tabanli islemler Ilkel Montaji
Polinom Hesaplayici
Görüntüleme Listesi
Bölümleme Islemleri
Çerçeve Tamponu
Tarama Islemi
CPU
Görüntüleme Listeli Çizim
Doku Hafizasi
Piksel Islemleri
72Listeyi yaratma ve çagirma
- Görüntüleme Listesini Olusturma
- GLuint id
- void init( void )
-
- id glGenLists( 1 )
- glNewList( id, GL_COMPILE )
- / diger OpenGL fonksiyonlari /
- glEndList()
-
- Yaratilmis bir listeyi çagirma
- void display( void )
-
- glCallList( id )
73Görüntüleme Listeleri
- Bir liste sonlandiktan sonra bile içerdigi durum
degisiklikleri kalicidir. - Tüm OpenGL fonksiyonlari görüntüleme listelerinde
saklanamaz. - Görüntüleme listeleri baska görüntüleme
listelerini çagirabilir. - Görüntüleme listeleri düzenlenebilir degildir,
ama baska listeleri çagiran bir A listesi
yapilabilir ve çagirdigi listeler gerekirse
silinip degistirilebilir.
74Görüntüleme Listeleri
- Matris Islemleri Matris hesaplamalari OpenGLde
bir listede tutulur. - Isik, Madde Özellikleri, Aydinlatma Modelleri
Kompleks aydinlatma içeren bir sahne
çizdigimizde, sahnedeki her nesne için malzeme
durumlarini degistirebiliriz. Bu islem ciddi
hesaplamalar içerdigi için malzeme ayarlari
yavaslayabilir. Eger malzeme tanimlarini liste
yöntemiyle tutarsak bu hesaplamalari malzemeleri
her degistirdigimizde yapmak durumunda kalmayiz.
Sadece hesaplama sonuçlarini saklariz, bunun
sonucunda ise isik sahnesi hizlanir.
75Görüntüleme Listeleri
- Imajlar Taradigimiz data formati donanim için
uygun olmayabilir. Bir liste derlendiginde OpenGL
veriyi donanimin tercih ettigi gösterime
dönüstürür. Karakterler bitmaplerden olustugu
için liste yöntemi ile taranan karakter, çizim
hizinda kayda deger bir etki yapar. - Kaplama Kaplamayi liste derlenirken tanimlarsak
maksimum verim elde ederiz. Bu islem kaplama
imajini hafizaya alir, böylece her kullanimda bu
imaji yeniden olusturmak zorunda kalmayiz. Ayrica
kaplamanin donanim formati OpenGL formatindan
farkli olabilir ve dönüsüm liste derleme aninda
yapilabilir. - Çokgen Desenleri Geometrik sekiller için de
liste yöntemi program hizini ve verimliligi
artirir.
76Görüntüleme Listeleri ve Hiyerarsi
- Bir araba örneginde
- Sase için bir görüntüleme listesi olustur
- Tekerlek için bir görüntüleme listesi olustur (4
kere çagir) - glNewList( CAR, GL_COMPILE )
- glCallList( CHASSIS )
- glTranslatef( )
- glCallList( WHEEL )
- glTranslatef( )
- glCallList( WHEEL )
-
- glEndList()
77Görüntüleme ve Tarama Ilkelleri
78Piksel-tabanli ilkeller
- Bitmap
- Her piksel için 1 bit bilgi kullanilir.
- Geçerli renk temel alinarak piksel rengi
güncellenir. - Görüntü (Image)
- Her piksel için tüm renk bilgisi kodlanir.
- OpenGL JPEG, PNG veya GIF gibi görüntü
biçimlerini tanimaz.
79Piksel Islemleri
- Piksel saklama ve aktarma islemleri
80Görüntüyü Konumlandirma
- glRasterPos3f( x, y, z )
- Görüntünün çizilecegi konum belirlenirken sol-alt
noktasi referans alinir (Tarama Konumu). - Tarama konumuna geometrik
- cisimlerin köse noktalari gibi
- dönüsüm uygulanabilir.
- Tarama konumu viewport
- disinda ise göz ardi edilir.
81Bitmaplerin Çizimi
- glBitmap( genislik, yükseklik, xorig, yorig,
xmove, ymove, bitmap ) - glRasterPos3ften önce kullanilan
- son glColor3f ile belirlenen renk ile
- konumunda çizilir.
- glRasterPos3f ile glBitmap arasinda
- bir glColor3f kullanilmasi bitmap
- rengini degistirmez
- Çizimden sonra tarama konumunu kadar tasir.
82Bitmap kullanarak Font Çizimi
- OpenGL bitmapleri font çizimi için kullanir.
- Her karakter bitmap içeren bir görüntü listesinde
saklanir. - Sistem fontlarina erismek için pencere sistemine
özel komutlar da kullanilabilir - glXUseXFont()
- wglUseFontBitmaps()
- glutBitmapCharacter(void font, int char)
- GL_BITMAP_TIMES_ROMAN_24
- GL_BITMAP_HELVETICA_10
-
83Görüntüleri Çizme
- glDrawPixels( genislik, yükseklik, biçim, veri
tipi, pikseller) - Belirlenen tarama konumunu sol-alt
- nokta kabul ederek yukari dogru
- taranarak görüntü çizilir.
- Hafizadaki saklama türünü belirlemek için birçok
biçim ve veri tipi vardir (Redbook Tablo 8.1
8.2). - En iyi performansi almak için donanim ile uyumlu
biçim ve veri tipi kullanilmalidir.
84Pikselleri Okumak
- Çerçeve tamponunda (framebuffer) (x, y)
noktasindan baslayarak belirli genislik ve
yükseklikte piksel verisi almak - glReadPixels( x, y, genislik, yükseklik, biçim,
veri tipi, pikseller ) - Pikseller otomatik olarak çerçeve tamponu
biçiminden istenilen biçime ve veri tipine
dönüstürülür - Çerçeve tamponundan piksel kopyalama
- glCopyPixels( x, y, genislik, yükseklik, tampon )
glCopyPixels glReadPixels glDrawPixels
85Piksel Ölçeklendirme (Zoom)
- glPixelZoom( x, y )
- Geçerli olan tarama konumunda pikselleri
genisletir, daraltir ya da yansitir. - Kesirli ölçeklendirme de kullanilabilir.
86Saklama ve Aktarma Biçimleri
- Saklama biçimleri hafizaya erisimi denetler
- Hafizadaki bayt siralamasini ayarlama
- Bir Görüntüden alt-Görüntü çikarimi
- glPixelStore() kitap s325
- Aktarma biçimleri piksel degerlerinin degisimine
izin verir - Ölçeklendirme ve meyillendirme
- Piksel haritalari kullanarak renk degisimi
- glPixelTransfer() kitap s330
87Doku Kaplama
88Doku Kaplama
ekran
geometri
Görüntü
89Doku Kaplama ve OpenGL Islem Hatlari
- Görüntüler ve geometri farkli islem hatlarini
takip ederek rasterizer asamasinda birlesirler - Dokunun karmasikligi kaplandigi geometrik
nesnenin karmasikligini etkilemez
90Örnek Uygulama
- Yandaki örnekte 256 256 boyutunda bir Görüntü
perspektif izdüsümde görüntülenen bir poligon
üzerine kaplanmistir.
91Doku Kaplamanin Adimlari
- Dokuyu tanimla
- Bir görüntüyü olustur veya dosyadan oku
- Görüntüyü doku ile eslestir
- Doku kaplamayi etkinlestir
- Doku koordinatlarini köse noktalari ile
eslestirme - Doku parametrelerini tanimlama
- Sarmak (wrapping), filtrelemek
92Doku Nesneleri
- Görüntüler saklanirken
- Her doku nesnesi için bir görüntü tanimlanabilir
- Birden fazla grafik içerigi tek bir görüntüyü
paylasabilir - Doku isimlerinin olusturulmasi
- glGenTextures( n, texIds )
- Kullanmadan önce dokunun baglanmasi
- glBindTexture( target, id )
- target GL_TEXTURE_1,2,3D
93Bir Doku Görüntüsünün Tanimlanmasi
Doku kaplama sadece RGBA renk türünde yapilabilir.
- Hafizadaki texellerin dizisinden bir doku
görüntüsü olusturma - glTexImage2D( target, level, internalFormat,
w, h, border, format, type, texels ) - level mipmap haricinde hep sifir olur.
- internalFormat R, G, B, A Luminance Intensity
(38 sabit) - w, h görüntünün boyutlari
- border kenar çizgisi kalinligi
- format R, G, B, A Luminance glDrawPixels()
- type veri tipi glDrawPixels()
- texels görüntünün tanimli oldugu dizi
Sayfa 380
Örn Resimden sadece R bileseni seçilebilir
94Bir Doku Görüntüsünün Dönüstürülmesi
OpenGL 2.0dan sonra 2nin üssü olma sarti
kaldirildi
- Eger görüntünün boyutlari 2nin üssü degilse
- gluScaleImage( format, w_in, h_in, type_in,
data_in, w_out, h_out, type_out, data_out ) - _in kaynak Görüntü için
- _out hedef Görüntü için
- type_in ve type_out ayni degilse veri tipi
dönüsümü yapilmis demektir. Bu sayede 24-bit renk
derinligini azaltmak ve hafizadan kazanç saglamak
olasidir.
95Dokuyu TanimlamaDiger Yöntemler
- Doku görüntüsünün kaynagi olarak çerçeve
tamponunu kullanma - glCopyTexImage1D(...)
- glCopyTexImage2D(...)
- Tanimlanmis olan bir dokunun belirli bir bölümünü
kullanma - glTexSubImage1D(...)
- glTexSubImage2D(...)
- glTexSubImage3D(...)
- Çerçeve tamponunun bir bölümünü kullanma
- glCopyTexSubImage(...)
96Bir dokunun eslenmesi
- glTexCoord() ile her köse noktasi için
tanimlanir.
Doku Uzayi
Nesne Uzayi
t
1, 1
(s, t) (0.2, 0.8)
0, 1
A
a
(0.4, 0.2)
c
b
B
C
(0.8, 0.4)
s
0, 0
1, 0
97Doku Koordinatlarinin Olusturulmasi
- Doku koordinatlarinin otomatik olarak
olusturulmasi - glTexGenifdv()
- Bir düzlemden uzakligina göre olusturma
- Olusturma biçimleri
- GL_OBJECT_LINEAR Doku nesneye sabitlenir.
- GL_EYE_LINEAR Doku kameraya göre sabit durur.
- GL_SPHERE_MAP Nesnenin etraftaki renkleri
yansitmasi (Terminator 2deki parlak adam)
98Dokuyu Uygulama Yöntemleri
- Filtreleme Yöntemleri
- minification - magnification
- özel mipmap minification filtreleri
- Sarma (Wrap) Yöntemleri
- Kenetleme (clamping)
- Tekrarlama (repeating)
- Doku Fonksiyonlari
- Nesnenin rengi ile dokunun renginin nasil
karisacagi - blend, modulate, replace
99Filtreleme Yöntemleri
Örnek glTexParameteri( target, type, mode )
100Mipmap
- Mipmap doku görüntülerinin çözünürlügünün
azaltilmasina olanak saglar. - Interpolasyon hatalarini azaltir.
- mipmap seviyesi level parametresi ile belirlenir
- glTexImageD( GL_TEXTURE_D, level, )
- GLU mipmap olusturma rutinleri de vardir
- gluBuildDMipmaps( )
- OpenGL 1.2 bu konuda yenilikler getirmistir
- Her mipmap seviyesini belirlemeye gerek kalmadi.
101Sarma Yöntemleri
- Örnek
- glTexParameteri( GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_CLAMP ) - glTexParameteri( GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_REPEAT )
102Doku Fonksiyonlari
- Nesnenin rengi ile dokunun renginin nasil
karisacagi - glTexEnvfiv( GL_TEXTURE_ENV, prop, param )
- Özellikler (prop)
- GL_TEXTURE_ENV_MODE yöntemleri
- GL_MODULATE doku ile kaplandigi nesnenin
rengini çarpar - GL_BLEND doku, nesne ve verilen renk
degerlerinin karisimini kullanir - GL_REPLACE nesnenin rengi yerine doku rengi
kullanilir - GL_TEXTURE_ENV_COLOR
- Blend rengi için kullanilir
103Doku Kaplama Uygulamasi
104Blending Antialiasing Fog
105Alpha 4. Renk Bileseni
- Seffafligin birimidir
- Transparan nesneleri (cam, su, vb.) taklit eder
- Nerede kullanilir
- Görüntülerin renklerini birlestirmede (blending)
- Örtüsme-önlemede (antialiasing)
- Eger blending etkin degilse göz ardi edilir
- glEnable( GL_BLEND )
106Blending
- Çerçeve tamponunda bulunan degerler ile yeni
çizilecek degerleri birlestirir. - glBlendFunc( src, dst )
107Antialiasing (Örtüsme Önleme)
- Egik çizgilerdeki çentikli görüntüyü azaltir
- glEnable( mode )
- GL_POINT_SMOOTH
- GL_LINE_SMOOTH
- GL_POLYGON_SMOOTH
- Hem RGBA hem de Indexed-Color renk tipinde
çalisabilir. - Görüntü kalitesi ile hiz arasinda seçim yapmak
için glHint(target, hint) kullanilabilir. - GL_NICEST, GL_FASTEST, GL_DONT_CARE
108Fog
- Atmosfer efektlerini tanimlayan genel bir
terimdir. Sis, buhar, duman, hava kirliligi gibi
durumlari temsil etmek için kullanilir. - Görüntüyü daha dogal yapmak için kullanilir.
Nesneler uzaklastikça görüntü soldurulur. - Fog aktif hale gelince, nesneler görüs alanindan
uzaklastikça fog rengi kullanarak
soluklastirilir. - Görsel simülasyon uygulamalarinda kisitli görüntü
elde etmek için Fog kullanimi gereklidir.
Özellikle uçak simülatörlerinde siklikla
kullanilir. - Karmasik simülasyon programlarinda fog kullanmak
performansi artirici etki yapar. Çünkü uzakta
oldugu için görünmeyen nesneleri çizmeye gerek
duyulmaz.
109Fog Modlari
- Linear Fog Mode
- Depth Cueing (derinlik isareti) efektleri için
kullanilir. Gözün baslangiç ve bitis uzakliklari
arasi fog rengi ile harmanlanir. - Exponential Fog Mode
- Sis, buhar, duman gibi daha dogal çevresel
efekleri vermek için kullanilir. Bu modda fog
yogunlugu (density) gözden uzaklastikça
exponansiyel olarak arttirilir.
110Fog Denklemleri
- Fog, bir fog rengi ile nesnenin rengini fog
karisim faktörünü kullanarak birlestirir. Bu
faktör asagidaki üç denklemden biri kullanilarak
hesaplanir ve 0-1 araligina indirgenir. - GL_LINEAR fog denklemi
- GL_EXP fog denklemi
- GL_EXP2 fog denklemi
- Z parçanin foglanmaya basladigi göz
koordinatlari uzakligi.
111Fog Kullanimi
- glEnable(GL_FOG) Fog etkin hale getirilir.
- glFog(pname, param) Yogunlugu kontrol etmek
için renk ve denklem seçimi yapilir. - pname GL_FOG_MODE ise param GL_LINEAR, GL_EXP
veya GL_EXP2 olur - pname GL_FOG_DENSITY, GL_FOG_START veya
GL_FOG_END ise param sayisal bir degerdir.
Varsayilan degerler sirasiyla 1, 0 ve 1dir. - glHint() GL_NICEST, GL_FASTEST, GL_DONT_CARE
112Fog Örnegi
113Çerçeve Tamponu
114Çerçeve Tamponu Siralamasi
Karistirma Titreklik
115Makas Testi
- Dikdörtgen biçiminde bir alan tanimlanarak bunun
içinde kalan kesimlerin çizilmesi saglanir. - glScissor( x, y, w, h )
- glEnable( GL_SCISSOR_TEST )
- Disarida kalan fragmentler kirpilir.
- Bir viewportun küçük bir bölümünün güncellenmesi
için kullanislidir. - glClear() islemlerini etkiler.
116Alfa Testi
- Pikselleri alfa degerlerine göre kabul etme veya
reddetme - glAlphaFunc( func, value )
- glEnable( GL_ALPHA_TEST )
- func asagidakilerden biri olabilir
- GL_NEVER GL_LESS
- GL_EQUAL GL_LEQUAL
- GL_GREATER GL_NOTEQUAL
- GL_GEUQAL GL_ALWAYS
117Sablon Tamponu
- Sablon tamponundaki degerler ile çizimi kontrol
etmek için kullanilir - Sablon testinde basarisiz olan parçalar çizilmez
- Örnek sablon tamponunda bir maske olustur ve
sadece bu maske disinda kalan nesneleri çiz.
118Sablon Tamponu Kullanimi
- glStencilFunc( func, ref, mask )
- func karsilastima fonksiyonunu kullanarak sablon
tamponundaki degeri ref degeri ile karsilastirir - func alfa testinde de kullanilan karsilastirma
fonksiyonlarindan biri olabilir. - Sadece mask maskesinde 1 olan bitlere uygulanir.
- glStencilOp( fail, zfail, zpass )
- Sablon tamponundaki degerlerin sablon testinde
basari, derinlik testinde basarisizlik ve
derinlik testinde basari durumlarinda nasil
güncellenecegini belirler GL_KEEP, GL_ZERO,
GL_REPLACE,
119Bir Maske Yaratmak
- glInitDisplayMode( GLUT_STENCIL )
- glEnable( GL_STENCIL_TEST )
- glClearStencil( 0x0 )
- glStencilFunc( GL_ALWAYS, 0x1, 0x1 )
- glStencilOp( GL_REPLACE, GL_REPLACE,
GL_REPLACE ) - maskeyi çiz
120Sablon Maskesini Kullanmak
- stencil 1 olan nesneleri çiz
- glStencilFunc( GL_EQUAL, 0x1, 0x1 )
- stencil ! 1 olan nesneleri çiz
- glStencilFunc( GL_NOTEQUAL, 0x1, 0x1 )
- glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP )
-
121Dithering (Titreklik)
- Renkleri daha iyi görünmeleri için titretir.
- Az renk içeren uygulamalarda daha fazla renk
varmis gibi gösterme teknigidir. Örnegin sadece
siyah beyaz basilan gazetelerde fotograflar
görüntülenirken gri tonlar siyah noktalarin
sikligina göre belirlenir. - glEnable( GL_DITHER )
122Pikseller üzerinde mantiksal islemler
- Renk tamponunda var olanlar ile yeni gelen
fragment degerlerini mantiksal islemler
kullanarak birlestirme - glLogicOp( mode )
- Genel Modlar
- GL_XOR
- GL_OR
- GL_AND
- GL_NOR
- GL_COPY
- GL_INVERT
glEnable(GL_COLOR_LOGIC_OP) glEnable(GL_INDEX_LOGI
C_OP)
123Biriktirme Tamponu
- Renk tamponlarinin bir araya getirilmesi
sorunlari - Sinirli renk çözünürlügü
- Kenetlemek (clamping)
- Dogruluk kaybi
- Biriktirme tamponu kayan nokta renk tamponu
- Sahneler biriktirme tamponunda biriktirilir
- Daha sonra sonuçlar çerçeve tamponuna aktarilir
124Biriktirme Tamponu Uygulamalari
- Birçok Görüntüyü tek Görüntüde birlestirme
- Tüm sahne için Antialiasing
- Belirli bir nesneye odaklanma
- Filtreleme
- Hareket eden nesnenin bulanikligi
125Biriktirme Tamponunun Kullanimi
- glAccum( op, value )
- Islemler
- Biriktirme tamponunda GL_ADD, GL_MULT
- Okuma tamponunda GL_ACCUM, GL_LOAD
- Yazma tamponuna geri aktarma GL_RETURN
- glAccum(GL_ACCUM, 0.5)
- Okuma tamponundaki her degeri (R,G,B,A) 0.5 ile
çarpar ve biriktirme tamponuna ekler. - ACCUM yerine LOAD olursa, ekleme yerine
degistirme. - ADD ve MULT biriktirme tamponunda islem yapar ve
sonuçlar yine biriktirme tamponuna islenir.
126Ileri Seviye OpenGL Konulari
127Multi-pass Rendering
- Blending allows results from multiple drawing
passes to be combined together - enables more complex rendering algorithms
Example of bump-mapping done with a
multi-pass OpenGL algorithm
128GPUs and GLSL
- Over the past few years, graphical processing
units (GPUs) have become more powerful and now
are programmable - Support first through OpenGL extensions and
OpenGL Shading Language (GLSL) - Incorporated in OpenGL 2.0
129OpenGL Pipeline Revisited
Texture Memory
texels
CPU
vertices
vertices
fragments
Fragment Processing
Geometry Processing
Rasterization
pixels
Frame Buffer
130Geometry Processing
- Coordinate Transformations
- Primitive Assembly
- Clipping
- Per-vertex lighting
- Programmable through a vertex program or vertex
shader
131Rasterizer
- Outputs fragments (potential pixels) that are
interior to primitives - Interpolates colors, depth, texture coordinates,
and other per vertex variables to obtain values
for each fragment - Not programmable
132Fragment Processing
- Assigns color to each fragment and updates frame
buffer - Handles hidden surface removal, texture mapping,
and blending - Programmable through fragment program or fragment
shader
133GLSL
- OpenGL Shading Language
- C like language for writing both vertex and
fragment shaders - Adds matrix and vector data types overloading
of operators - OpenGL state variables available to shaders
- Variables can be passed among shaders and
applications
134Vertex Shader Applications
- General Vertex Lighting
- Off loading CPU
- Dynamic Meshes
- Morphing
- Additional Application Specific Vertex Attributes
135Vertex Shader Execution
136Fragment Shader Applications
- Per Fragment Lighting
- Bump Maps
- Environment Maps
- Texture Manipulation
- Shadow Maps
137Fragment Shader Execution
138Linking with Application
- In OpenGL application, we must
- Read shaders
- Compile shaders
- Define variables
- Link everything together
- OpenGL 2.0 contains a set of functions for each
of these steps
139Advanced Primitives
- Vertex Arrays
- Bernstein Polynomial Evaluators
- basis for GLU NURBS
- NURBS (Non-Uniform Rational B-Splines)
- GLU Quadric Objects
- sphere
- cylinder (or cone)
- disk (circle)
140Summary / Q A
- Ed Angel
- Dave Shreiner
- Vicki Shreiner
141On-Line Resources
- http//www.opengl.org
- start here up to date specification and lots of
sample code - newscomp.graphics.api.opengl
- http//www.sgi.com/software/opengl
- http//www.mesa3d.org/
- Brian Pauls Mesa 3D
- http//www.cs.utah.edu/narobins/opengl.html
- very special thanks to Nate Robins for the OpenGL
Tutors - source code for tutors available here!
142Books
- OpenGL Programming Guide, 5th Edition
- OpenGL Reference Manual, 4th Edition
- Interactive Computer Graphics A top-down
approach with OpenGL, 4rd Edition - OpenGL Programming for the X Window System
- includes many GLUT examples
143Thanks for Coming
- Questions and Answers
- Ed Angel angel_at_cs.unm.edu
- Dave Shreiner shreiner_at_siggraph.org
- Vicki Shreiner vshreiner_at_sgi.com
144Course Evaluations
- Please dont forget to tell us what you think
- http//www.siggraph.org/courses_evaluation