OpenGL 2.x

advertisement
OpenGL 2.x
İnönü Üniversitesi
Bilgisayar Mühendisliği
Genel Bakış
 Komutlar, fonksiyonlar ve yapıları; eski ve terkedilmiştir.
 Grafik donanımının yetersiz kaldığı sistemler ve OpenGL
eğitimi için hala kullanılmaktadır.
 Sabit fonksiyon mantığı geçerlidir ancak shader
programlama imkanı mevcuttur.
 Referans için http://www.opengl.org/sdk/docs/man2/
 The Red Book
 Bazı uygulama örnekleri
http://www.opengl.org/wiki/Code_Resources
OpenGL İsimlendirme Teamülleri
void glColor3d(1.0, 1.0, 0.0);
void glVertex4dv(a);
//float a[] = {1.0, 2.0, 1.0, 0.0};
OpenGL İsimlendirme Teamülleri
 Sabitler için GL_CONSTANT (büyük harfler)
Son Ek
Veri Türü
C Dilinde Karşılığı
OpenGL Tür Tanımı
b
8 bit tamsayı
Signed char
GLbyte
s
16 bit tamsayı
Short
Glshort
i
32 bit tamsayı
Long
Glint, Glsizei
f
32 bit ondalıklı sayı
Float
Glfloat, Glclampf
d
64 bit ondalıklı sayı
Double
Gldouble, Glclampd
ub
8 bit işaretsiz tamsayı
Unsigned char
Glubyte, Glboolean
us
16 bit işaretsiz tamsayı
Unsigned short
Glushort
ui
32 bit işaretsiz tamsayı
Unsigned long
Gluint, Gluenum, GLbitfield
OpenGL’ in Temel Geometrik
Bileşenleri
GL_POINTS
GL_LINES
GL_LINE_STRIP
GL_LINE_LOOP
GL_TRIANGLES
GL_TRIANGLE_STRIP
GL_TRIANGLE_FAN
OpenGL’ in Temel Geometrik
Bileşenleri
GL_QUADS
GL_QUAD_STRIP
GL_POLYGON
Arabellekler
 OpenGL ‘’parçaları’’ (fragment) bütünleştirerek nihai çıktıyı
arabelleklere kaydeder.
 Arabellekler 2B veri dizileridir ve genelde her bir dizi elemanında bir
piksel verisi kayıtlıdır.
 Arabellekler aynı zamanda sonraki rendering adımlarında
kullanılmak üzere ara basamakların çıktısını da kaydetmek için
kullanılabilir.
 Framebuffer: Ekranda o anki görüntü karesinin bulunduğu arabellek
 OpenGL programcısını, OpenGL uygulamasının kullandığı ekran alanı
ilgilendirir.
 Her karede bu arabellek otomatik olarak temizlenmez. Bu yüzden
glClear komutu ile arabelleği temizlemek gerekir.
Diğer Arabellekler
 Color Buffer (Renk Arabelleği): Her pikselin renk bilgisini
içerir.
 Depth Buffer / Z Buffer (Derinlik Arabelleği): Her pikselin
derinlik bilgisini içerir. Kameraya diğerlerinden daha
yakındaki nesnelerin düzgünce çizilmesinde kullanılır.
 Stencil Buffer (Kalıp Arabelleği): Karmaşık şekillerin
kırpılmasında kullanılır.
 Accumulation Buffer (Birikme Arabelleği): Ara sonuçları
sonra render etmek için saklamada kullanılır.
glBegin()/glEnd() Blokları
 OpenGL 2.x’ te temel bileşen çizdirmek için
glBegin()/glEnd() fonkisyonları kullanılır. (sabit
fonksiyon mantığı)
 Bir blokla aynı tür bileşeni çok sayıda çizdirmek
mümkündür.
Örnek
void ücgen_cizdir() {
glBegin( GL_TRIANGLES );
glColor3f( 0.0f, 0.0f, 1.0f ); // mavi renk
glVertex2f( 0.0f, 0.0f ); // (0,0) noktası
glColor3f( 1.0f, 0.0f, 0.0f ); // kırmızı renk
glVertex2f( 0.0f, 1.0f ); // (0,1) noktası
glVertex2f( 1.0f, 0.0f );
glEnd();
}
İyi ve Kötü Yönleri
 İyi yönleri
 Basit nesneler için kullanımı çok kolaydır.
 Nitelikler kolaylıkla belirlenebilir.
 Kötü yönleri
 Pek çok nesneyi belirlemede oldukça hantaldır.
 Kodlama çok ayrıntılıdır.
 Fazla sayıda nesne çiziminde çok yavaş çalışır.
 Köşe sayısı kadar fonksiyon çağrısı
 Her kare için bütün köşe bilgisini CPU’ dan GPU’ ya göndermek
durumundadır.
Köşe Dizileri (Vertex Arrays)
 glBegin() / glEnd() bloklarında çok sayıda fonksiyon
çağrısı ile performans düşmesinin önüne geçmek
içindir.
 Bütün köşe verisi bir diziye kaydedilir ve rendering
işlemi bir seferde yapılır.
 glBegin() / glEnd() bloklarıyla bir küp çizdirmek için
glVertex() 24 kez çağrılmaktadır. Bu yöntemle bir
fonksiyon çağrısı çizim için yeterlidir.
Örnek
void display_triangle() {
float vertices[] = { 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f
0.0f, 0.0f, 1.0 };
glEnableClientState( GL_VERTEX_ARRAY );
// köşe verisinin nereden alınacağı
glVertexPointer( 3, GL_FLOAT, 0, vertices );
unsigned intindices[] = { 0, 1, 2 };
// çizdirme çağrısı
glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices );
glDisableClientState( GL_VERTEX_ARRAY );
}
İyi ve Kötü Yönleri
 İyi yönleri
 Kullanımı yine kolaydır.
 Sadece ufak bir düzenek kurmak gerekir.
 Diğer yönteme göre çok hızlıdır.
 Kötü yönleri
 Hala her kare için köşe verisini CPU’ dan GPU’ ya
göndermek gerekir.
Görüntüleme Listesi (Display List)
 Bir fonksiyon çağrısı ile rastgele bileşenlerin defalarca
çizilmesini sağlar.
 Belli bir nesnenin çizimi için yazılan komutların
derlenmesidir.
 Yapısı gereği sadece tamamen sabit geometrili
nesnelerde işe yarar.
Örnek
int list;
void initialize_triangle(){
list = glGenLists( 1 );
glNewList( list, GL_COMPILE ); // listeyi başlatır
glBegin( GL_TRIANGLE );
glVertex2f( 0.0, 0.0 );
glVertex2f( 0.0, 1.0 );
glVertex2f( 1.0, 1.0 );
glEnd();
glEndList(); // listeyi bitirir
}
// Örnek çizdirme fonksiyonu
void display_callback(){
glCallList( list ); // derlenmiş listenin render edilmesi
}
İyi ve Kötü Yönleri
 İyi yönleri
 Çok hızlıdır.
 Kötü yönleri
 Sadece değişmez yapılar içindir.
 Çok miktarda GPU belleği tüketebilir.
Temel Grafik Programı Yapısı
Görüntüleme için gereken
kütüphaneler
Animasyon, G/Ç, pencere
kontrolü için tanımlanan
fonksiyonlar
Görüntünün oluşmasını
sağlayan aygıt (device)
Bu görüntünün sürekliliğini
sağlayan (sonsuz) döngü
#include <iostream>
//#include <windows.h>
#include <GL/glut.h>
void myKeyHandler( unsigned char key, int x, int y) {
if (key == 27) {exit(1);}
printf("\n key pressed is %c at (%d, %d)", key , x, y);
}
void display() {
glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_TRIANGLES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex2f(-0.5f, -0.5f);
glVertex2f( 0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();
glFlush();
}
int main(int argc, char** argv) { glutInit(&argc, argv);
glutCreateWindow("OpenGL Setup Test");
glutInitWindowSize(320, 320);
glutInitWindowPosition(50, 50);
glutKeyboardFunc(myKeyHandler);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Download