OpenGL Programlamaya Giris - PowerPoint PPT Presentation

1 / 144
About This Presentation
Title:

OpenGL Programlamaya Giris

Description:

OpenGL nedir? OpenGL bilgisayar grafi i izmek i in bir API dir. Temel geometrik ekiller ve g r nt ler ile y ksek kalitede renkli g r nt ler olu turur – PowerPoint PPT presentation

Number of Views:191
Avg rating:3.0/5.0
Slides: 145
Provided by: edut1275
Category:

less

Transcript and Presenter's Notes

Title: OpenGL Programlamaya Giris


1
OpenGL Programlamaya Giris
  • Yrd. Doç. Dr. Altan Mesut

2
Konular
  • OpenGLin ve kullanim alanlarinin tanitimi
  • OpenGLin yeteneklerinin ve özelliklerinin
    gösterimi ve tanitilmasi
  • Etkilesimli bir 3 boyutlu grafik programinin
    OpenGL ile yazilmasi

3
Ilgili 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/

4
OpenGL 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

5
Ilgili 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

6
OpenGL ve ilgili APIler
7
Basit Bir Program
  • Siyah bir arka plan üzerine beyaz bir kare çizer.

8
simple.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()
9
Olay 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.

10
OpenGL Programinin Genel Yapisi
Bir pencere yapilandir ve aç
OpenGL durumu baslat
Kullanici olaylarini isle
Görüntüyü çiz
11
Bir 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.
12
Bir 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.
13
Bir 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.
14
OpenGL 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)
15
Programlarda 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,

16
GLUT 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 )

17
OpenGL 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
18
OpenGL Geometrik Sekilleri
  • Tüm geometrik sekiller köse noktalari ile
    belirlenir

GL_POINTS
GL_POLYGON
GL_LINE_STRIP
GL_LINES
GL_LINE_LOOP
19
Bir 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()
20
OpenGL Nasil Çalisir?
21
OpenGLin Ç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

22
OpenGL durum kontrolünün gücü
Görünüm OpenGLin durumunu tanimlamakla kontrol
edilir.
23
OpenGLin 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.

24
OpenGLin 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()

25
OpenGLde 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 )

26
Genisletilmis simple.c
  • Çikti ayni olacak, fakat tüm ilgili durum
    degerleri tanimlanacak.
  • Tanimlanan degerler
  • Renkler
  • Görüntüleme kosullari
  • Pencere özellikleri

27
gl.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
28
GLUT 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
30
Sekiller Uygulamasi
31
Dönüsümler
32
3D 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
33
Koordinat 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.

34
Homojen 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.

35
3D 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

36
Dö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.

37
Dö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.

38
Matris 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 )

39
Projeksiyon 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

40
Izdü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)

41
Dö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

42
Izdüsüm Uygulamasi
43
Konumlandirma 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 )

44
Dönüsüm Uygulamasi
45
Kamera 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.

46
Konumlandirma 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.

47
Konumlandirma 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

48
Animasyon ve Derinlik Tamponu
49
Çift Tampon
50
Animasyon
  • Ç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

51
Derinlik Tamponu veSakli Yüzeylerin Atilmasi
1
1
2
2
4
4
Renk Tamponu
Derinlik Tamponu
8
8
16
16
Görüntü
52
Derinlik 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

53
Isiklandirma
54
Isiklandirma 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

55
OpenGL 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

56
Isigin 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.

57
Yü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.

58
Malzeme Ö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)
59
Isik 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)

60
Isik Tipleri
  • OpenGL iki farkli isik tipi saglar
  • Lokal (Nokta) isik kaynaklari
  • Sonsuz (Dogrusal) isik kaynaklari
  • Isik tipi w koordinati ile belirlenir

61
Isiklari Aktif Hale Getirme
  • Isiklandirmayi açma
  • glEnable( GL_LIGHTING )
  • Isik kaynaginin dügmesini açma
  • glEnable( GL_LIGHTn )

62
Isik Malzeme Uygulamasi
63
Isigin 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.

64
Isik Yönü Uygulamasi
65
Spot Isik
  • Isigin etkisini merkezilestirir
  • GL_SPOT_DIRECTION
  • GL_SPOT_CUTOFF
  • GL_SPOT_EXPONENT

66
Isigin Mesafe ile Zayiflamasi
  • Mesafe arttikça isik yogunlugu azalir.
  • Bu özellik kullanilirsa gerçeklik artar.
  • GL_CONSTANT_ATTENUATION
  • GL_LINEAR_ATTENUATION
  • GL_QUADRATIC_ATTENUATION

67
Isik 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)

68
Isigi 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

69
Görüntüleme Listeleri
70
Dogrudan ç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

71
Dogrudan ç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
72
Listeyi 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 )

73
Gö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.

74
Gö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.

75
Gö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.

76
Gö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()

77
Görüntüleme ve Tarama Ilkelleri
78
Piksel-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.

79
Piksel Islemleri
  • Piksel saklama ve aktarma islemleri

80
Gö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.

81
Bitmaplerin Ç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.

82
Bitmap 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

83
Gö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.

84
Pikselleri 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
85
Piksel Ölçeklendirme (Zoom)
  • glPixelZoom( x, y )
  • Geçerli olan tarama konumunda pikselleri
    genisletir, daraltir ya da yansitir.
  • Kesirli ölçeklendirme de kullanilabilir.

86
Saklama 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

87
Doku Kaplama
88
Doku Kaplama
ekran
geometri
Görüntü
89
Doku 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.

91
Doku 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

92
Doku 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

93
Bir 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
94
Bir 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.

95
Dokuyu 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(...)

96
Bir 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
97
Doku 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)

98
Dokuyu 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

99
Filtreleme Yöntemleri
Örnek glTexParameteri( target, type, mode )
100
Mipmap
  • 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.

101
Sarma Yöntemleri
  • Örnek
  • glTexParameteri( GL_TEXTURE_2D,
    GL_TEXTURE_WRAP_S, GL_CLAMP )
  • glTexParameteri( GL_TEXTURE_2D,
    GL_TEXTURE_WRAP_T, GL_REPEAT )

102
Doku 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

103
Doku Kaplama Uygulamasi
104
Blending Antialiasing Fog
105
Alpha 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 )

106
Blending
  • Çerçeve tamponunda bulunan degerler ile yeni
    çizilecek degerleri birlestirir.
  • glBlendFunc( src, dst )

107
Antialiasing (Ö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

108
Fog
  • 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.

109
Fog 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.

110
Fog 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.

111
Fog 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

112
Fog Örnegi
113
Çerçeve Tamponu
114
Çerçeve Tamponu Siralamasi
Karistirma Titreklik
115
Makas 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.

116
Alfa 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

117
Sablon 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.

118
Sablon 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,

119
Bir 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

120
Sablon 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 )

121
Dithering (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 )

122
Pikseller ü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)
123
Biriktirme 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

124
Biriktirme 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

125
Biriktirme 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.

126
Ileri Seviye OpenGL Konulari
127
Multi-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
128
GPUs 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

129
OpenGL Pipeline Revisited
Texture Memory
texels
CPU
vertices
vertices
fragments
Fragment Processing
Geometry Processing
Rasterization
pixels
Frame Buffer
130
Geometry Processing
  • Coordinate Transformations
  • Primitive Assembly
  • Clipping
  • Per-vertex lighting
  • Programmable through a vertex program or vertex
    shader

131
Rasterizer
  • 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

132
Fragment 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

133
GLSL
  • 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

134
Vertex Shader Applications
  • General Vertex Lighting
  • Off loading CPU
  • Dynamic Meshes
  • Morphing
  • Additional Application Specific Vertex Attributes

135
Vertex Shader Execution
136
Fragment Shader Applications
  • Per Fragment Lighting
  • Bump Maps
  • Environment Maps
  • Texture Manipulation
  • Shadow Maps

137
Fragment Shader Execution
138
Linking 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

139
Advanced 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)

140
Summary / Q A
  • Ed Angel
  • Dave Shreiner
  • Vicki Shreiner

141
On-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!

142
Books
  • 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

143
Thanks for Coming
  • Questions and Answers
  • Ed Angel angel_at_cs.unm.edu
  • Dave Shreiner shreiner_at_siggraph.org
  • Vicki Shreiner vshreiner_at_sgi.com

144
Course Evaluations
  • Please dont forget to tell us what you think
  • http//www.siggraph.org/courses_evaluation
Write a Comment
User Comments (0)
About PowerShow.com