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; }