Ders Sunusu - Altan MESUT
Download
Report
Transcript Ders Sunusu - Altan MESUT
Yrd. Doç. Dr. Altan Mesut
Konular:
OpenGL’in ve kullanım alanlarının tanıtımı
OpenGL’in yeteneklerinin ve özelliklerinin gösterimi
ve tanıtılması
Etkileşimli bir 3 boyutlu grafik programının OpenGL
ile yazılması
İlgili 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/
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
3 boyutlu grafikler ile etkileşimi uygulamalar yaratır
İşletim sisteminden ve pencere sisteminden
bağımsızdır
İlgili kütüphaneler (API’ler)
GLU (OpenGL Utility Library)
OpenGL’in bir parçasıdır
Eğriler, yüzeyler, yüzey döşeme görüntüleri, … içerir.
AGL, GLX, WGL
OpenGL ile pencere sistemleri arasındaki katmandır
GLUT (OpenGL Utility Toolkit)
Daha yalın bir pencere sistemi bütünleştirmesi sunar
Resmi anlamda OpenGL’in parçası değildir
OpenGL ve ilgili API’ler
uygulama programı
OpenGL Motif
veya benzeri
GLX, AGL
veya WGL
X, Win32, Mac O/S
GLUT
GLU
GL
yazılım ve/veya donanım
Basit Bir Program
Siyah bir arka plan üzerine beyaz bir kare çizer.
simple.c
#include <GL/glut.h>
void mydisplay(){
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_POLYGON);
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){
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
glutMainLoop();
}
Olay Döngüsü
Her GLUT programı bir gösterim fonksiyonu içerir.
Bizim programımızda da mydisplay adında bir
gösterim fonksiyonu vardır.
Görüntünün tazelenmesini gerektiren bir olay
olduğunda (mesela pencere açıldığında) gösterim
fonksiyonu çağrılır.
Ana fonksiyon (main) programın bir olay döngüsüne
girmesi ile son bulur.
OpenGL Programının Genel Yapısı
Bir pencere
yapılandır
ve aç
OpenGL
durumu
başlat
Kullanıcı
olaylarını
işle
Görüntüyü
çiz
Bir OpenGL Programı
#include <GL/glut.h>
#include "cube.h"
void main( int argc, char *argv[] )
{
glutInit( &argc, argv );
glutInitDisplayMode( GLUT_RGBA |
GLUT_DEPTH );
glutCreateWindow( argv[0] );
init();
glutDisplayFunc( display );
glutReshapeFunc( reshape );
glutMainLoop();
}
Programın ‘main’
bölümünde: OpenGL
penceresini açmak ve
kullanıcıdan girdi
almak için GLUT
kullanılır.
Bir OpenGL Programı (devam)
void init( void )
{
glClearColor( 0, 0, 0, 1 );
gluLookAt( 2, 2, 2, 0, 0, 0, 0, 1, 0 );
glEnable( GL_DEPTH_TEST );
}
Bir başlangıç
OpenGL durumu
yapılandırılır.
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 );
}
Kullanıcı
pencere
boyutunu
değiştirdiğinde
kullanılır.
Bir OpenGL Programı (devam)
void display( void )
{
int i, j;
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
glBegin( GL_QUADS );
for ( i = 0; i < NUM_CUBE_FACES; ++i ) {
glColor3fv( faceColor[i] );
for ( j = 0; j < NUM_VERTICES_PER_FACE; ++j ) {
glVertex3fv( vertex[face[i][j]] );
}
}
glEnd();
glFlush();
}
OpenGL
3D
noktalardan
(vertices) bir
küp çizer.
OpenGL Komut Biçimi
glVertex3fv( v )
kütüphane
Veri Tipi
Bileşen Sayısı
2 - (x,y)
3 - (x,y,z)
4 - (x,y,z,w)
b
ub
s
us
i
ui
f
d
-
byte
unsigned byte
short
unsigned short
int
unsigned int
float
double
Vektör
skalar düzende “v”
yer almaz
glVertex2f( x, y )
Programlarda neler gerekli?
Header Dosyalar
#include <GL/gl.h>
#include <GL/glu.h>
#include <GL/glut.h>
Kütüphaneler
opengl32.lib, glut.lib, glut32.lib
Veri Tipleri (uyumluluk için)
GLfloat, GLint, GLenum, …
GLUT Callback Fonksiyonları
Bir olay gerçekleştiğinde çağrılacak rutin
Pencere büyüklüğü değişimi
Kullanıcı girişi
Animasyon
GLUT ile callback’lerin kaydedilmesi
glutDisplayFunc( display );
glutIdleFunc( idle );
glutKeyboardFunc( keyboard );
…
OpenGL neleri çizebilir?
Temel geometrik şekiller
noktalar, çizgiler ve çokgenler
Temel resimler (image)
Resim ve bitmap’ler
Resim ve geometri için farklı işlem hattı var
doku kaplaması sırasında birbirine bağlanır
Duruma bağlı çizimler
renkler, materyaller, ışık kaynakları, ...
s11-Fig1.2
OpenGL Geometrik Şekilleri
Tüm geometrik şekiller köşe noktaları ile belirlenir
GL_POINTS
GL_POLYGON
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_QUAD_STRIP
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
GL_QUADS
Bir Geometrik Şekli Tanımlama
Temel şekiller aşağıdaki iki fonksiyon ile tanımlanır:
glBegin( şekilTipi );
glEnd();
şekilTipi noktaların nasıl bir araya getirileceğini belirler
glBegin( şekilTipi );
for ( i = 0; i < n; ++i ) {
glColor3f( red[i], green[i], blue[i] );
glVertex3fv( coords[i] );
}
glEnd();
OpenGL Nasıl Çalışır?
OpenGL’in
nesneyi nasıl
çizeceğini
tanımla
Nesneyi çiz
OpenGL’in Çizimini Kontrol Etme
OpenGL’in çizim durumunu (state) tanımlama:
Durum, nesnelerin nasıl çizileceğini belirleyen değerler
kümesidir.
Mavi bir üçgen çizilecekse, önce mavi renk glColor
fonksiyonu ile ayarlanır, sonra çizgiler glVertex ile
oluşturulur.
gölgelendirme
– ışık
doku kaplama
– çizgi stilleri (stipples)
çokgen kalıpları
– şeffaflık
OpenGL durum kontrolünün gücü
Görünüm
OpenGL’in
durumunu
tanımlamakla
kontrol edilir.
OpenGL’in Durumunu Tanımlama
OpenGL’in durumunu tanımlamak için 3 yöntem
vardır:
1.
Noktaları işlemek için kullanılan değerleri tanımlama
Durumu tanımlamanın en genel yöntemleri:
glColor() / glIndex()
glNormal()
glTexCoord()
Durum glVertex() ten önce tanımlanmalıdır.
OpenGL’in Durumunu Tanımlama
2.
3.
Bir çizim biçimini açma
glEnable() / glDisable()
Belirli bir çizim biçiminin özelliklerini tanımlama
Her biçim kendi değerlerini tanımlamak için özel
komutlar içerir.
glMaterialfv()
OpenGL’de Renk Modeli
OpenGL RGB renk uzayını kullanır
Sıralı renk (indexed color) biçimi de vardır, ama pek
kullanılmaz
Renkler [ 0.0, 1.0] aralığındaki ondalıklı sayılar ile veya
[0,255] aralığındaki tamsayılar ile temsil edilirler
Örneğin pencerenin arka plan rengini belirlemek için
aşağıdaki fonksiyon kullanılabilir:
glClearColor( 1.0, 0.3, 0.6, 1.0 );
glColor3ub( 240, 130, 100 );
Genişletilmiş simple.c
Çıktı aynı olacak, fakat tüm ilgili durum değerleri
tanımlanacak.
Tanımlanan değerler:
Renkler
Görüntüleme koşulları
Pencere özellikleri
#include <GL/glut.h>
gl.h ve glu.h da
glut.h ile eklenir
int main(int argc, char** argv)
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(500,500);
glutInitWindowPosition(0,0);
Pencere özellikleri tanımlandı
glutCreateWindow("simple");
glutDisplayFunc(mydisplay);
init();
Görüntüleme callback fonksiyonu
OpenGL durumu tanımlandı
glutMainLoop();
}
Olay döngüsüne giriş
GLUT fonksiyonları
glutInit uygulamanın komut satırından bilgi almasını ve
sistemi başlatmasını sağlar
gluInitDisplayMode pencere için çizim özelliklerini
belirler. Örneğimizde seçilen değerler:
RGB renk biçimi
Tekli tampon biçimi
glutWindowSize piksel olarak pencere boyutu
glutWindowPosition ekranın sol üst köşesinden uzaklığı
glutCreateWindow “simple” adındaki pencerenin
yaratılması
glutDisplayFunc görüntüleme callback fonksiyonu
glutMainLoop sonsuz olay döngüsüne giriş
Siyah arka plan rengi
void init()
Mat pencere
{
glClearColor (0.0, 0.0, 0.0, 1.0);
glColor3f(1.0, 1.0, 1.0);
Beyaz ile çizme veya doldurma
glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);
}
Görünüm biçimi
Şekiller Uygulaması
3D Görüntüleme = Fotoğraf
Çekme
3 boyutlu görüntüleme fotoğraf çekmeye benzer.
Objenin konumlandırılması (modeling)
Kameranın yerleştirilmesi (viewing)
Lens seçimi (projection)
görüş alanı
Görüş alanı (viewport)
kamera
model
tripod
Koordinat Sistemleri ve
Dönüşümler
Görüntüyü oluşturma adımları:
1.
2.
3.
4.
Geometriyi belirleme (dünya koordinatları)
Kamerayı belirleme (kamera koordinatları)
Görüntüleme biçimini belirleme (pencere koordinatları)
Görüş alanına eşleme (ekran koordinatları)
Bütün adımlarda dönüşümler kullanılabilir.
Her dönüşüm koordinat sistemlerinde bir
değişime denk gelir.
Homojen Koordinatlar
Her vertex (köşe noktası) bir vektördür (kolon).
x
y
v
z
w
w genellikle 1’dir.
Tüm dönüşüm işlemleri matris çarpımları ile
yapılır.
3D Dönüşümler
Noktalar 4 x 4 boyutunda matrisler ile çarpılarak
dönüştürülürler
Tüm matrisler sütun-öncelikli olarak kaydedilirler
En son tanımlanan matris en önce çarpılandır (dönüşüm
matrisi solda, vertex matrisi sağda)
Matrisin gösterimi:
m0
m
M 1
m2
m3
m4
m8
m5
m9
m6
m10
m7
m11
m12
m13
m14
m15
Dönüşümleri Belirleme
Dönüşümler iki farklı yöntem ile belirlenebilir:
Matrisleri belirleyerek
glLoadMatrix, glMultMatrix
İşlemi belirleyerek
glRotate, glOrtho
Programcı gerçek matrisin ne olduğunu bilmek
zorunda değildir.
Dönüşümleri Programlama
Kameranın pozisyonu ve cisimlerin 3D geometrisi ile
ilgili çizme, görüntüleme, konumlandırma ve
yönlendirme işlemlerinden önce matrislerin hangi
işlem için düzenleneceği belirtilmelidir:
glMatrixMode(GL_PROJECTION)
Dönüşümler ilgili sırada bir araya getirilir. Artarda
yazılan dönüşümler son yazılandan ilk yazılana doğru
gerçekleştirilir.
Matris İşlemleri
Matris yığınını (stack) belirleme
glMatrixMode(GL_MODELVIEW veya GL_PROJECTION)
Diğer Matris veya Yığın İşlemleri
glLoadIdentity()
glPushMatrix()
glPopMatrix()
Viewport
Genellikle pencere genişliği ile aynıdır
Eğer viewport genişlik/yükseklik oranı projeksiyondakinden
farklı ise nesneler olduklarından farklı biçimde görünebilirler
(daha geniş, daha yüksek, …)
glViewport( x, y, genişlik, yükseklik )
Projeksiyon Dönüşümü
Perspektif izdüşümde (projeksiyon)
görünüm uzayı frustum adı verilen
kesik piramit gibidir.
Perspektif izdüşüm
gluPerspective( fovy, aspect, zNear, zFar )
glFrustum( left, right, bottom, top, zNear, zFar )
Orthografik parallel izdüşüm
glOrtho(left, right, bottom, top, zNear, zFar)
gluOrtho2D( left, right, bottom, top )
calls glOrtho with z values near zero
İzdüşüm Dönüşümlerini
Uygulamak
Orthografik izdüşüm için tipik kullanım örneği:
glMatrixMode( GL_PROJECTION );
glLoadIdentity();
glOrtho(left, right, bottom, top, zNear, zFar);
Dönüşümleri Görmek
Kamerayı konumlandırma
Kamera ayağını aç ve kamerayı yerleştir
Bir sahnede hareket etmek için
Görüntüleme dönüşümünü değiştir ve sahneyi
tekrar çiz
gluLookAt( eyex, eyey, eyez,
aimx, aimy, aimz,
upx, upy, upz )
Yukarı (up) vektör kameranın üstünün neresi
olduğunu belirler
tripod
İzdüşüm Uygulaması
Konumlandırma Dönüşümlerini
Uygulamak
Nesneyi taşımak:
glTranslate{fd}( x, y, z )
Nesneyi bir eksen etrafında döndürmek:
glRotate{fd}( açı, x, y, z )
Açı derece cinsinden girilir
Nesneyi büyütmek/küçültmek,
genişletmek/daraltmak ve yansımasını
oluşturmak:
glScale{fd}( x, y, z )
Dönüşüm Uygulaması
Kamera yeri ve konumlandırma
arasındaki ilişki
Kamerayı belirli bir doğrultuda taşıma ile
görüntülenen dünyadaki tüm nesneleri tam tersi olan
doğrultuda taşıma arasında bir fark yoktur.
Görüntüleme dönüşümleri birçok konumlandırma
dönüşümüne eşittir.
gluLookAt() komutunun yaptığı işi birçok
glTranslate ve glRotate kombinasyonu ile
yapabilirsiniz.
Konumlandırma Dönüşümlerini
Beraber Kullanma
Problem: Hiyerarşik Nesneler
Bir pozisyon bir önceki pozisyona bağlı
Robot kolu veya el gibi birleşik yapılar
Çözüm:
Sütun-öncelikli matrisler ilgili sırada çarpılmalıdır
Taşımayı takip eden döndürme ile döndürmeyi takip
eden taşıma aynı sonucu vermez
Matris çarpımı sıra-bağımlı bir işlemdir.
Konumlandırma Dönüşümlerini
Beraber Kullanma
Problem: Nesne görüntülenen dünyanın
merkezine göre konumlanır
Nesneyi kendi etrafında döndürmek isterken başka bir
eksen etrafında dönüyor
Çözüm: sabit koordinat sistemi
Konumlandırma dönüşümlerinden önce nesneyi
merkeze taşı
İstenilen döndürmeyi yaptıktan sonra önceki taşımanın
tersi ile tekrar eski noktaya taşı
Çift Tampon
1
Ön Tampon
2
1
4
8
16
2
4
8
16
Görüntü
Arka Tampon
Animasyon
Çift renk tamponu kullanımı isteği yapılır
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE );
Renk tamponu temizlenir
glClear( GL_COLOR_BUFFER_BIT );
Sahne çizimi yapılır
Ön ve arka tamponlar yer değiştirilir
glutSwapBuffers();
2, 3 ve 4. adımlar tekrar edilerek animasyon
sağlanır
glutIdleFunc() callback kullanılır
Derinlik Tamponu ve
Saklı Yüzeylerin Atılması
1
2
Renk Tamponu
1
4
8
16
2
4
8
16
Görüntü
Derinlik Tamponu
Derinlik Tamponu Kullanımı
Derinlik tamponu kullanımı isteği yapılır
glutInitDisplayMode( GLUT_RGB | GLUT_DOUBLE
| GLUT_DEPTH );
Özellik aktif hale getirilir
glEnable( GL_DEPTH_TEST );
Renk ve derinlik tamponları temizlenir
glClear( GL_COLOR_BUFFER_BIT |
GL_DEPTH_BUFFER_BIT );
Sahne çizilir
Renk tamponları yer değiştirilir
Işıklandırma İlkeleri
Işıklandırma işleminde nesnelerin ışığı nasıl
yansıtacağı belirlenir.
Etki eden faktörler:
Nesnelerin malzeme bileşimi
Işığın rengi ve yönü
Evrensel ışıklandırma parametreleri
Çevresel ışıl
İki yönlü ışık
Hem color index hem de
RGBA biçimlerinde çalışır
OpenGL ışığı nasıl kullanır
OpenGL’de ışıklandırma Phong ışıklandırma modeline
dayanır. Çizim ilkelinin her noktasında, bir renk o
ilkelin malzeme özelliklerinin ışık ayarları ile birlikte
kullanılması ile hesaplanır.
Bir noktanın ışık altındaki rengini bulmak için, o
noktaya verilen renk haricinde 4 bileşenin daha
bilinmesine gerek vardır. Bunlar:
Ambient
Diffuse
Specular
Emmission
Işığın Bileşenleri
Ambient: Hangi noktadan geldiği tam olarak
belirlenemeyen (tüm yönlerden geliyormuş gibi
görünen) çevresel ışık bileşenidir.
Diffuse: Tek bir noktadan gelen ışık bileşenidir.
Specular: Belirli bir noktadan gelen ve parlak yüzeyli
nesnelerde yansıma yapan ışık bileşenidir.
Emission: Işık yayan yüzeylerdeki ışık bileşenidir. Işık
sanki nesnenin içinde parlıyor gibi algılanır.
Yüzey Normalleri
Normaller bir yüzeyin ışığı nasıl yansıtacağını belirler
glNormal3f( x, y, z )
Geçerli olan normal vektörü vertex’in renginin
hesaplanmasında kullanılır.
Normallerin otomatik olarak ayarlanması için
glEnable( GL_NORMALIZE )
veya düzgün olmayan ölçeklemelerde
glEnable( GL_RESCALE_NORMAL )
kullanılır.
Malzeme Özellikleri
Yüzey özelliklerini belirleyen fonksiyon:
glMaterialfv( yüzey, özellik, değer );
GL_DIFFUSE
Temel renk
GL_SPECULAR
Yansıma noktasındaki renk
GL_AMBIENT
Nesnenin direkt ışık almadığı zamanki rengi
GL_EMISSION
Nesnenin yaydığı ışığın rengi
GL_SHININESS
Işığı yansıtma değeri (0-128)
Ön ve arka yüzeyde farklı malzeme kullanılmış olabilir
GL_FRONT, GL_BACK, GL_FRONT_AND_BACK
Işık Kaynakları
glLightfv( ışık, özellik, değer );
ışık parametresi n farklı ışık değerinden birini alır
GL_LIGHT0 – GL_LIGHTn
glGetIntegerv( GL_MAX_LIGHTS, &n );
özellikler
Renkler (GL_AMBIENT, GL_DIFFUSE, GL_SPECULAR)
Yer (GL_POSITION)
Tip (GL_SPOT_...)
Zayıflama (GL_..._ATTENUATION)
Işık Tipleri
OpenGL iki farklı ışık tipi sağlar
Lokal (Nokta) ışık kaynakları
Sonsuz (Doğrusal) ışık kaynakları
Işık tipi w koordinatı ile belirlenir
sonsuzbir ışık x y z
w 0
eğer
y
x
z
w
0
noktasal
bir
ışık
w
w
w
Işıkları Aktif Hale Getirme
Işıklandırmayı açma:
glEnable( GL_LIGHTING );
Işık kaynağının düğmesini açma:
glEnable( GL_LIGHTn );
Işık Malzeme Uygulaması
Işığın yer ve yön kontrolü
Modelview matrisindeki değişim ışığın yönünü de
etkiler
Işığın ne zaman tanımlandığına göre farklılık gösterir
göz koordinatları (ışık hep aynı noktadan geliyor; güneş)
dünya koordinatları (sahnede sabit ışık kaynakları var; lamba)
model koordinatları (hareketli ışık; el feneri & araba farı)
Işığın yerini kontrol etmek için matrisler push ve pop
edilebilir.
Işık Yönü Uygulaması
Spot Işık
Işığın etkisini merkezileştirir
GL_SPOT_DIRECTION
GL_SPOT_CUTOFF
GL_SPOT_EXPONENT
65
Işığın Mesafe ile Zayıflaması
Mesafe arttıkça ışık yoğunluğu azalır.
Bu özellik kullanılırsa gerçeklik artar.
GL_CONSTANT_ATTENUATION
GL_LINEAR_ATTENUATION
GL_QUADRATIC_ATTENUATION
1
fi
2
k c kl d k q d
66
Işık Modeli Özellikleri
glLightModelfv( özellik, değer );
İki yönlü ışıklandırma sağlamak için
GL_LIGHT_MODEL_TWO_SIDE,{0.2, 0.2, 0.2, 1.0}
Evrensel bir çevresel ışık rengi vermek için
GL_LIGHT_MODEL_AMBIENT, GL_FALSE (GL_TRUE)
Viewpoint değiştikçe ışığın etkisinin de değişmesi
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)
67
Işığı iyi kullanmak için:
Modeldeki ayrıntının çokluğunun ışık işlemlerini de
yavaşlatacağı unutulmamalıdır.
Hızlı ışıklandırma için tek bir sonsuz ışık kaynağı
kullanılmalıdır.
Vertex başına en düşük hesaplama
Doğrudan çizim yerine
Görüntüleme Listeleri ile çizim
Doğrudan çizim
Çizim ilkelleri çizim hattına gönderilerek direkt olarak
çizilir
Çizilenler hafızada kalıcı değildir
Görüntüleme Listeleri ile çizim
Çizim ilkelleri görüntüleme listelerine yerleştirilir
Görüntüleme listeleri grafik sunucusunda tutulur
Farklı bir şekilde tekrar çizim yapılabilir
OpenGL grafik ortamları tarafından paylaşılabilir
Doğrudan çizim yerine
Görüntüleme Listeleri ile çizim
Doğrudan Çizim
Polinom
Hesaplayıcı
CPU
Görüntüleme
Listesi
Görüntüleme
Listeli Çizim
Vektör tabanlı
işlemler &
İlkel Montajı
Tarama İşlemi
Doku
Hafızası
Piksel
İşlemleri
Bölümleme
İşlemleri
Çerçeve
Tamponu
Listeyi yaratma ve çağırma
Görüntüleme Listesini Oluşturma
GLuint id;
void init( void )
{
id = glGenLists( 1 );
glNewList( id, GL_COMPILE );
/* diğer OpenGL fonksiyonları */
glEndList();
}
Yaratılmış bir listeyi çağırma
void display( void )
{
glCallList( id );
}
Görüntüleme Listeleri
Bir liste sonlandıktan sonra bile içerdiği durum
değişiklikleri kalıcıdır. *
Tüm OpenGL fonksiyonları görüntüleme
listelerinde saklanamaz.
Görüntüleme listeleri başka görüntüleme
listelerini çağırabilir.
Görüntüleme listeleri düzenlenebilir değildir, ama;
başka listeleri çağıran bir A listesi yapılabilir ve
çağırdığı listeler gerekirse silinip değiştirilebilir.
Görüntüleme Listeleri
Matris İşlemleri : Matris hesaplamaları OpenGL’de
bir listede tutulur.
Işık, Madde Özellikleri, Aydınlatma Modelleri :
Kompleks aydınlatma içeren bir sahne
çizdiğimizde, sahnedeki her nesne için malzeme
durumlarını değiştirebiliriz. Bu işlem ciddi
hesaplamalar içerdiği için malzeme ayarları
yavaşlayabilir. Eğer malzeme tanımlarını liste
yöntemiyle tutarsak bu hesaplamaları malzemeleri
her değiştirdiğimizde yapmak durumunda
kalmayız. Sadece hesaplama sonuçlarını saklarız,
bunun sonucunda ise ışık sahnesi hızlanır.
Görüntüleme Listeleri
İmajlar : Taradığımız data formatı donanım için uygun
olmayabilir. Bir liste derlendiğinde OpenGL veriyi
donanımın tercih ettiği gösterime dönüştürür. Karakterler
bitmap’lerden oluştuğu için liste yöntemi ile taranan
karakter, çizim hızında kayda değer bir etki yapar.
Kaplama : Kaplamayı liste derlenirken tanımlarsak
maksimum verim elde ederiz. Bu işlem kaplama imajını
hafızaya alır, böylece her kullanımda bu imajı yeniden
oluşturmak zorunda kalmayız. Ayrıca kaplamanın
donanım formatı OpenGL formatından farklı olabilir ve
dönüşüm liste derleme anında yapılabilir.
Çokgen Desenleri: Geometrik şekiller için de liste yöntemi
program hızını ve verimliliği artırır.
Görüntüleme Listeleri ve Hiyerarşi
Bir araba örneğinde;
Şase için bir görüntüleme listesi oluştur
Tekerlek için bir görüntüleme listesi oluştur (4 kere
çağır)
glNewList( CAR, GL_COMPILE );
glCallList( CHASSIS );
glTranslatef( … );
glCallList( WHEEL );
glTranslatef( … );
glCallList( WHEEL );
…
glEndList();
Piksel-tabanlı ilkeller
Bitmap
Her piksel için 1 bit bilgi kullanılır.
Geçerli renk temel alınarak piksel rengi güncellenir.
Görüntü (Image)
Her piksel için tüm renk bilgisi kodlanır.
OpenGL; JPEG, PNG veya GIF gibi görüntü biçimlerini
tanımaz.
Piksel İşlemleri
Piksel saklama ve aktarma işlemleri:
Görüntüyü Konumlandırma
glRasterPos3f( x, y, z )
Görüntünün çizileceği konum belirlenirken sol-alt
noktası referans alınır (Tarama Konumu).
Tarama konumuna geometrik
cisimlerin köşe noktaları gibi
dönüşüm uygulanabilir.
Tarama konumu viewport
dışında ise göz ardı edilir.
Tarama Konumu
Bitmap’lerin Çizimi
glBitmap( genişlik, yükseklik, xorig, yorig,
xmove, ymove, bitmap )
glRasterPos3f’ten önce kullanılan
son glColor3f ile belirlenen renk ile
x xorig y yorig
konumunda çizilir.
glRasterPos3f ile glBitmap arasında
bir glColor3f kullanılması bitmap
rengini değiştirmez
Çizimden sonra tarama konumunu
xmove, ymove kadar taşır.
yorig
width
xorig
xmove
81
Bitmap kullanarak Font Çizimi
OpenGL bitmap’leri font çizimi için kullanır.
Her karakter bitmap içeren bir görüntü listesinde
saklanır.
Sistem fontlarına erişmek için pencere sistemine özel
komutlar da kullanılabilir:
glXUseXFont()
wglUseFontBitmaps()
glutBitmapCharacter(void *font, int char);
GL_BITMAP_TIMES_ROMAN_24
GL_BITMAP_HELVETICA_10
…
82
Görüntüleri Çizme
glDrawPixels( genişlik, yükseklik,
biçim, veri tipi, pikseller)
Belirlenen tarama konumunu sol-alt
nokta kabul ederek yukarı doğru
taranarak görüntü çizilir.
Hafızadaki saklama türünü belirlemek için birçok
biçim ve veri tipi vardır (Redbook Tablo 8.1 & 8.2).
En iyi performansı almak için donanım ile uyumlu biçim
ve veri tipi kullanılmalıdır.
Pikselleri Okumak
Çerçeve tamponunda (framebuffer) (x, y) noktasından
başlayarak belirli genişlik ve yükseklikte piksel verisi
almak:
glReadPixels( x, y, genişlik, yükseklik,
biçim, veri tipi, pikseller )
Pikseller otomatik olarak çerçeve tamponu biçiminden
istenilen biçime ve veri tipine dönüştürülür
Çerçeve tamponundan piksel kopyalama:
glCopyPixels( x, y, genişlik, yükseklik,
tampon )
glCopyPixels = glReadPixels + glDrawPixels
Piksel Ölçeklendirme (Zoom)
glPixelZoom( x, y )
Geçerli olan tarama konumunda pikselleri genişletir,
daraltır ya da yansıtır.
Kesirli ölçeklendirme de kullanılabilir.
Raster
Position
glPixelZoom(1.0, -1.0);
85
Saklama ve Aktarma Biçimleri
Saklama biçimleri hafızaya erişimi denetler
Hafızadaki bayt sıralamasını ayarlama
Bir Görüntüden alt-Görüntü çıkarımı
glPixelStore(): kitap s:325
Aktarma biçimleri piksel değerlerinin değişimine izin
verir
Ölçeklendirme ve meyillendirme
Piksel haritaları kullanarak renk değişimi
glPixelTransfer(): kitap s:330
86
Doku Kaplama
y
z
x
geometri
t
Görüntü
s
ekran
Doku Kaplama ve OpenGL İşlem
Hatları
Görüntüler ve geometri farklı işlem hatlarını takip
ederek rasterizer aşamasında birleşirler
Dokunun karmaşıklığı kaplandığı geometrik nesnenin
karmaşıklığını etkilemez
Vektörel
işlemler
Piksel tabanlı
işlemler
geometri işlem hattı
rasterizer
piksel işlem hattı
Örnek Uygulama
Yandaki örnekte 256 × 256
boyutunda bir Görüntü perspektif
izdüşümde görüntülenen bir
poligon üzerine kaplanmıştır.
Doku Kaplamanın Adımları
1. Dokuyu tanımla
Bir görüntüyü oluştur veya dosyadan oku
Görüntüyü doku ile eşleştir
Doku kaplamayı etkinleştir
2. Doku koordinatlarını köşe noktaları ile
eşleştirme
3. Doku parametrelerini tanımlama
Sarmak (wrapping), filtrelemek
Doku Nesneleri
Görüntüler saklanırken:
Her doku nesnesi için bir görüntü tanımlanabilir
Birden fazla grafik içeriği tek bir görüntüyü paylaşabilir
Doku isimlerinin oluşturulması:
glGenTextures( n, *texIds );
Kullanmadan önce dokunun bağlanması:
glBindTexture( target, id );
target: GL_TEXTURE_{1,2,3}D
Bir Doku Görüntüsünün
Tanımlanması
renk türünde yapılabilir.
Doku kaplama sadece RGBA
Hafızadaki texel’lerin dizisinden bir doku görüntüsü
oluşturma:
glTexImage2D( target, level, internalFormat,
w, h, border, format, type, *texels );
Sayfa 380
level: mipmap haricinde hep sıfır olur.
internalFormat: R, G, B, A; Luminance; Intensity (38 sabit)
w, h: görüntünün boyutları
border: kenar çizgisi kalınlığı
format: R, G, B, A; Luminance… ~ glDrawPixels()
type: veri tipi ~ glDrawPixels()
*texels: görüntünün tanımlı olduğu dizi
Örn:
Resimden
sadece R
bileşeni
seçilebilir
Bir Doku Görüntüsünün
Dönüştürülmesi
üssü olma şartı kaldırıldı
OpenGL 2.0’dan sonra 2’nin
Eğer görüntünün boyutları 2’nin üssü değilse:
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 aynı değilse veri tipi
dönüşümü yapılmış demektir. Bu sayede 24-bit
renk derinliğini azaltmak ve hafızadan kazanç
sağlamak olasıdır.
Dokuyu Tanımlama:
Diğer Yöntemler
Doku görüntüsünün kaynağı olarak çerçeve tamponunu
kullanma:
glCopyTexImage1D(...)
glCopyTexImage2D(...)
Tanımlanmış olan bir dokunun belirli bir bölümünü
kullanma:
glTexSubImage1D(...)
glTexSubImage2D(...)
glTexSubImage3D(...)
Çerçeve tamponunun bir bölümünü kullanma:
glCopyTexSubImage*(...)
95
Bir dokunun eşlenmesi
glTexCoord*() ile her köşe noktası için
tanımlanır.
t
0, 1
Doku Uzayı
1, 1
(s, t) = (0.2, 0.8)
A
a
b
0, 0
Nesne Uzayı
c
(0.4, 0.2)
B
1, 0 s
C
(0.8, 0.4)
Doku Koordinatlarının
Oluşturulması
Doku koordinatlarının otomatik olarak
oluşturulması:
glTexGen{ifd}[v]()
Bir düzlemden uzaklığına göre oluşturma:
Ax By Cz D 0
Oluşturma biçimleri:
GL_OBJECT_LINEAR: Doku nesneye sabitlenir.
GL_EYE_LINEAR: Doku kameraya göre sabit durur.
GL_SPHERE_MAP: Nesnenin etraftaki renkleri
yansıtması (Terminator 2’deki parlak adam)
Dokuyu Uygulama Yöntemleri
Filtreleme Yöntemleri
minification - magnification
özel mipmap minification filtreleri
Sarma (Wrap) Yöntemleri
Kenetleme (clamping)
Tekrarlama (repeating)
Doku Fonksiyonları
Nesnenin rengi ile dokunun renginin nasıl karışacağı
blend, modulate, replace
Filtreleme Yöntemleri
Örnek:
glTexParameteri( target, type, mode );
Doku
Polygon
Magnification
Doku
Polygon
Minification
Mipmap
Mipmap: doku görüntülerinin çözünürlüğünün azaltılmasına
olanak sağlar.
İnterpolasyon hatalarını azaltır.
mipmap seviyesi level parametresi ile belirlenir:
glTexImage*D( GL_TEXTURE_*D, level, … )
GLU mipmap oluşturma rutinleri de vardır:
gluBuild*DMipmaps( … )
OpenGL 1.2 bu konuda yenilikler getirmiştir:
Her mipmap seviyesini belirlemeye gerek kalmadı.
Sarma Yöntemleri
Örnek:
glTexParameteri( GL_TEXTURE_2D,
GL_TEXTURE_WRAP_S, GL_CLAMP )
glTexParameteri( GL_TEXTURE_2D,
GL_TEXTURE_WRAP_T, GL_REPEAT )
t
s
texture
GL_REPEAT
wrapping
GL_CLAMP
wrapping
Doku Fonksiyonları
Nesnenin rengi ile dokunun renginin nasıl karışacağı
glTexEnv{fi}[v]( GL_TEXTURE_ENV, prop, param )
Özellikler (prop):
GL_TEXTURE_ENV_MODE yöntemleri:
GL_MODULATE : doku ile kaplandığı nesnenin rengini
çarpar
GL_BLEND: doku, nesne ve verilen renk değerlerinin
karışımını kullanır
GL_REPLACE: nesnenin rengi yerine doku rengi kullanılır
GL_TEXTURE_ENV_COLOR
Blend rengi için kullanılır
Doku Kaplama Uygulaması
Alpha: 4. Renk Bileşeni
Şeffaflığın birimidir
Transparan nesneleri (cam, su, vb.) taklit eder
Nerede kullanılır:
Görüntülerin renklerini birleştirmede (blending)
Örtüşme-önlemede (antialiasing)
Eğer “blending” etkin değilse göz ardı edilir
glEnable( GL_BLEND )
Blending
Çerçeve tamponunda bulunan değerler ile yeni
çizilecek değerleri birleştirir.
glBlendFunc( src, dst )
Cr src C f dst C p
Blending
Equation
Fragment
(src)
Framebuffer
Pixel
(dst)
Blended
Pixel
Antialiasing (Örtüşme Önleme)
Eğik çizgilerdeki çentikli görüntüyü azaltır
glEnable( mode )
GL_POINT_SMOOTH
GL_LINE_SMOOTH
GL_POLYGON_SMOOTH
Hem RGBA hem de Indexed-Color renk
tipinde çalışabilir.
Görüntü kalitesi ile hız arasında seçim yapmak
için glHint(target, hint) kullanılabilir.
GL_NICEST, GL_FASTEST, GL_DONT_CARE
Fog
Atmosfer efektlerini tanımlayan genel bir terimdir. Sis,
buhar, duman, hava kirliliği gibi durumları temsil etmek
için kullanılır.
Görüntüyü daha doğal yapmak için kullanılır. Nesneler
uzaklaştıkça görüntü soldurulur.
Fog aktif hale gelince, nesneler görüş alanından
uzaklaştıkça fog rengi kullanarak soluklaştırılır.
Görsel simülasyon uygulamalarında kısıtlı görüntü elde
etmek için Fog kullanımı gereklidir. Özellikle uçak
simülatörlerinde sıklıkla kullanılır.
Karmaşık simülasyon programlarında fog kullanmak
performansı artırıcı etki yapar. Çünkü uzakta olduğu için
görünmeyen nesneleri çizmeye gerek duyulmaz.
Fog Modları
Linear Fog Mode :
Depth Cueing (derinlik işareti) efektleri için kullanılır.
Gözün başlangıç ve bitiş uzaklıkları arası fog rengi ile
harmanlanır.
Exponential Fog Mode :
Sis, buhar, duman gibi daha doğal çevresel efekleri
vermek için kullanılır. Bu modda fog yoğunluğu
(density) gözden uzaklaştıkça exponansiyel olarak
arttırılır.
Fog Denklemleri
Fog, bir fog rengi ile nesnenin rengini fog karışım faktörünü
kullanarak birleştirir. Bu faktör aşağıdaki üç denklemden biri
kullanılarak hesaplanır ve 0-1 aralığına indirgenir.
GL_LINEAR fog denklemi:
GL_EXP fog denklemi:
GL_EXP2 fog denklemi:
Z : parçanın fog’lanmaya başladığı göz koordinatları uzaklığı.
Fog Kullanımı
glEnable(GL_FOG): Fog etkin hale getirilir.
glFog*(pname, param): Yoğunluğu kontrol etmek için
renk ve denklem seçimi yapılır.
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 sayısal bir değerdir. Varsayılan
değerler sırasıyla 1, 0 ve 1’dir.
glHint(): GL_NICEST, GL_FASTEST, GL_DONT_CARE
Fog Örneği
Makas
Testi
Derinlik
Testi
Karıştırma
Titreklik
Blending
Dithering
Poly.
CPU
Şablon
Testi
Alfa
Testi
Per
Vertex
Raster
DL
Texture
Pixel
Frag
FB
Mantıksal
İşlemler
Framebuffer
Fragment
Çerçeve Tamponu Sıralaması
Makas Testi
Dikdörtgen biçiminde bir alan tanımlanarak bunun
içinde kalan kesimlerin çizilmesi sağlanır.
glScissor( x, y, w, h )
glEnable( GL_SCISSOR_TEST )
Dışarıda kalan fragment’ler kırpılır.
Bir viewport’un küçük bir bölümünün güncellenmesi
için kullanışlıdır.
glClear() işlemlerini etkiler.
115
Alfa Testi
Pikselleri alfa değerlerine göre kabul etme veya
reddetme
glAlphaFunc( func, value )
glEnable( GL_ALPHA_TEST )
func aşağıdakilerden biri olabilir:
GL_NEVER
GL_EQUAL
GL_GREATER
GL_GEUQAL
GL_LESS
GL_LEQUAL
GL_NOTEQUAL
GL_ALWAYS
Şablon Tamponu
Şablon tamponundaki değerler ile çizimi kontrol
etmek için kullanılır
Şablon testinde başarısız olan parçalar çizilmez
Örnek: şablon tamponunda bir maske oluştur ve sadece
bu maske dışında kalan nesneleri çiz.
Şablon Tamponu Kullanımı
glStencilFunc( func, ref, mask )
func karşılaştıma fonksiyonunu kullanarak şablon
tamponundaki değeri ref değeri ile karşılaştırır
func alfa testinde de kullanılan karşılaştırma
fonksiyonlarından biri olabilir.
Sadece mask maskesinde 1 olan bitlere uygulanır.
glStencilOp( fail, zfail, zpass )
Şablon tamponundaki değerlerin; şablon testinde
başarı, derinlik testinde başarısızlık ve derinlik testinde
başarı durumlarında nasıl güncelleneceğini belirler:
GL_KEEP, GL_ZERO, GL_REPLACE, …
118
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
119
Şablon 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
);
120
Dithering (Titreklik)
Renkleri daha iyi görünmeleri için titretir.
Az renk içeren uygulamalarda daha fazla renk varmış
gibi gösterme tekniğidir. Örneğin sadece siyah beyaz
basılan gazetelerde fotoğraflar görüntülenirken gri
tonlar siyah noktaların sıklığına göre belirlenir.
glEnable( GL_DITHER )
121
Pikseller üzerinde
mantıksal işlemler
Renk tamponunda var olanlar ile yeni gelen fragment
değerlerini mantıksal işlemler kullanarak birleştirme:
glLogicOp( mode )
Genel Modlar:
GL_XOR
GL_OR
GL_AND
GL_NOR
GL_COPY
GL_INVERT
…
glEnable(GL_COLOR_LOGIC_OP)
glEnable(GL_INDEX_LOGIC_OP)
122
Biriktirme Tamponu
Renk tamponlarının bir araya getirilmesi sorunları
Sınırlı renk çözünürlüğü
Kenetlemek (clamping)
Doğruluk kaybı
Biriktirme tamponu : “kayan nokta” renk tamponu
Sahneler biriktirme tamponunda biriktirilir
Daha sonra sonuçlar çerçeve tamponuna aktarılır
Biriktirme Tamponu Uygulamaları
Birçok Görüntüyü tek Görüntüde birleştirme
Tüm sahne için Antialiasing
Belirli bir nesneye odaklanma
Filtreleme
Hareket eden nesnenin bulanıklığı
Biriktirme Tamponunun Kullanımı
glAccum( op, value )
İşlemler:
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 değeri (R,G,B,A) 0.5 ile çarpar ve
biriktirme tamponuna ekler.
ACCUM yerine LOAD olursa, ekleme yerine değiştirme.
ADD ve MULT biriktirme tamponunda işlem yapar ve
sonuçlar yine biriktirme tamponuna işlenir.
125
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
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
OpenGL Pipeline Revisited
texels
Texture
Memory
CPU
vertices
vertices
Geometry
Processing
fragments
Rasterization
Fragment
Processing
pixels
Frame
Buffer
Geometry Processing
Coordinate Transformations
Primitive Assembly
Clipping
Per-vertex lighting
Programmable through a vertex program or vertex
shader
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
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
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
Vertex Shader Applications
General Vertex Lighting
Off loading CPU
Dynamic Meshes
Morphing
Additional Application Specific Vertex Attributes
Vertex Shader Execution
Fragment Shader
Applications
Per Fragment Lighting
Bump Maps
Environment Maps
Texture Manipulation
Shadow Maps
Fragment Shader Execution
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
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)
Ed Angel
Dave Shreiner
Vicki Shreiner
On-Line Resources
http://www.opengl.org
start here; up to date specification and lots of sample code
news:comp.graphics.api.opengl
http://www.sgi.com/software/opengl
http://www.mesa3d.org/
Brian Paul’s 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!
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
Thanks for Coming
Questions and Answers
Ed Angel
[email protected]
Dave Shreiner [email protected]
Vicki Shreiner [email protected]
Course Evaluations
Please don’t forget to tell us what you think:
http://www.siggraph.org/courses_evaluation