1 / 18

OpenGL 2.x

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.

kat
Download Presentation

OpenGL 2.x

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. OpenGL 2.x İnönü Üniversitesi Bilgisayar Mühendisliği

  2. Genel Bakış Komutlar, fonksiyonlar ve yapıları; eski ve terkedilmiştir. Grafik donanımının yetersiz kaldığı sistemler ve OpenGLeğ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/ TheRedBook Bazı uygulama örnekleri http://www.opengl.org/wiki/Code_Resources

  3. OpenGL İsimlendirme Teamülleri void glColor3d(1.0, 1.0, 0.0); void glVertex4dv(a); //floata[] = {1.0, 2.0, 1.0, 0.0};

  4. OpenGL İsimlendirme Teamülleri Sabitler için GL_CONSTANT (büyük harfler)

  5. OpenGL’ in Temel Geometrik Bileşenleri GL_LINES GL_LINE_STRIP GL_LINE_LOOP GL_POINTS GL_TRIANGLES GL_TRIANGLE_FAN GL_TRIANGLE_STRIP

  6. OpenGL’ in Temel Geometrik Bileşenleri GL_QUADS GL_QUAD_STRIP GL_POLYGON

  7. 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ü karesininbulunduğ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.

  8. Diğer Arabellekler ColorBuffer(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.

  9. glBegin()/glEnd() Blokları OpenGL2.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.

  10. Ö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(); }

  11. İ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.

  12. Köşe Dizileri (VertexArrays) 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.

  13. Örnek voiddisplay_triangle() { floatvertices[] = { 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 ); unsignedintindices[] = { 0, 1, 2 }; // çizdirme çağrısı glDrawElements( GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices ); glDisableClientState( GL_VERTEX_ARRAY ); }

  14. İ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.

  15. Görüntüleme Listesi (DisplayList) 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.

  16. Örnek intlist; voidinitialize_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 voiddisplay_callback(){ glCallList( list ); // derlenmiş listenin render edilmesi }

  17. İ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.

  18. 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); } voiddisplay() { 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(); } intmain(intargc, char** argv) { glutInit(&argc, argv); glutCreateWindow("OpenGLSetup Test"); glutInitWindowSize(320, 320); glutInitWindowPosition(50, 50); glutKeyboardFunc(myKeyHandler); glutDisplayFunc(display); glutMainLoop(); return0; }

More Related