OpenGL Çalışma Mantığı ve Tasarımı - Mustafa Sabri OĞUZ

Duyurular

17 Haziran 2014 Salı

OpenGL Çalışma Mantığı ve Tasarımı


OpenGL'in bir arabirim olduğunu önceki yazımda bahsetmiştim. Peki bu arabirim nasıl çalışıyor? Bunun hakkında yaptığım araştırmalar neticesinde kafamda oluşanları aktarmaya çalışacağım.

    Çalışma mantığını iki şekilde inceleyebiliriz;
    1. Genel Çalışma Mantığı
    2. OpenGL Boru Hattı (PipeLine)

    Genel Çalışma Mantığı

    OpenGL'in donanım üzerinde teorik çalışma mantığı
    Yukarıda şemada genel bir bilgisayarın, izlediği yolları tarif etmeye çalıştım. Bunları sırayla açıklamak gerekirse;

    3D Grafik Uygulaması

    Burası yapmak istediklerimizin kalbi diyebiliriz. OpenGL arabirimi ile istediğimiz görüntü veya şekli elde etmek için gerekli komutları programladığımız yer.

    Şemada görüldüğü üzere grafik uygulamamız, işletim sistemi ve ekran kartı olmak üzere iki ayrı iletişimi vardır.

    İşletim Sistemi

    Günümüzde bilgisayarları etkin kullanabilmek için işletim sistemleri kullanmaktayız. Aksi halde herkesin kod yazacak bilgisi ve vakti bulunmadığından boş bir kabuk gibi durur.

    Herhangi bir program veya grafik içeriği geliştirirken, kullandığımız işletim sisteminin kurallarına (standartlarına) göre pencere oluşturmamız gerekiyor. Bu nedenle OpenGL içeriğimizi bağlı bulunduğumuz işletim sisteminin penceresine ilişkilendirmemiz gerektiğinden, grafik uygulamasının ilk uğradığı yer diyebiliriz.
    "OpenGL'in işletim sistemlerinden bağımsız değil miydi?"
    Evet, bağımsızdır. Fakat kastedilen, OpenGL komutlarının hangi işletim sisteminde yada hangi programlama dilinde olursa olsun değişmemesi ve çalışmasıdır.
    "OpenGL uygulamalarımın bir veya birden fazla işletim sisteminde nasıl çalıştırabilirim?"
    Bunun için izleyebileceğiniz iki yol mevcuttur.
    1. Her işletim sisteminin kendi api'lerini (win32, X window) öğrenmek ve sisteme göre tasarlamak.
    1. Cross-platform özelliği bulunan kütüphaneler (GLFW, FreeGlut, QT, wxWidget) kullanmaktır. (Önerilen)

    Ekran Kartı

    Sisteme görüntü vermesini sağlayan birimdir.

    Gelişen OpenGL teknikleri ve grafik işlemcilerinin varlığı sayesinde direk etkileşim kurabilmek mümkün olmuştur. Böylece grafik işlemleri için grafik işlemcisini kullanarak, normal işlemcinin üzerindeki yükü azaltmış olmaktadır.

    OpenGL
    Kendisine gelen komutları (emirleri) matematiksel işlemlerle yorumlayarak, uygun makine diline çevirip, grafik işlemcisine(GPU) ileten arabirimdir.

    Grafik işlemcisi (GPU)
    İşlemcinin yükünü hafifletmek amacıyla grafik üretmek üzere özel tasarlanan işlemcidir.

    İşlemci

    Programlama dilinde belirtiğimiz komutları (emirleri) ve verileri işleyen mekanizma.

    Ve nihayetinde OpenGL komutlarının dışında kalan, programlama dilinin ve işletim sisteminin kapsadığı komutları işlemek üzere işlemciyle etkileşim kurmaktadır.


    OpenGL BoruHattı (PipeLine)

    OpenGL'in Ekran Kartı üzerinde çalışma mantığı
    Opengl uygulamalarının işlemsel bir düzene sahiptir, buna Görüntüleme BoruHattı (Rendering PipeLine) denilmektedir.

    Bu işlem iki katmanlı işleyişe sahiptir;

    1.Pixel Verisi (Pixel Data)
    Piksel-tabanlı görüntü ilkelleri(primitive)

    2.Vertex Verisi (Vertex Data)
    Geometrik vertex-tabanlı görüntü ilkelleri

    Bu iki aşamalı işlemin nasıl gerçekleştigini anlamak için bir çizimi incelemek yeterli olacaktır. Çizim işlemi, geometrik şekiller(noktalar, çizgiler ve çokgenler) yani vertex data kısmı çizim işleminin bir diger kısmı ise pixel data kısmı görüntü ilkeleri (piksel, resimler ve bitmapler) iki katmanlı bu işlem işlenerek renk,ışık özellikleri ve diğer özellikler hazırlanır ve görüntü tamponuna (framebuffer'a) yollanır, yani ekran kartına yönlendirilir.

    Bu açıklamanın ardından, grafiksel işleyişine göre sırayla açıklamak gerekirse;

    Görüntü Listesi (Display List)
    Görüntü listeleri pixel data veya vertex data verilerini istediğiniz zaman kullanmak üzere kaydeden komut grubudur, bu komut grubu dışında immidiate modunuda kullanabilirsiniz ancak display list modu, immidiate modundan daha verimlidir.Görüntüleme listelerinin (Display lists) çalışma mantığı, display list komutlarının çağırımı ile listelerdeki tanımlara göre işlenmesiyle oluşmaktadır.

    Hesaplayıcılar(Evaluators)
    Evaluators adı üstünde hesaplayıcılar OpenGL'de oluşturan geometrik şekiller, mekansal koordinat değerleri, renk değerleri dokular vs. her biri aynı şekilde olmadığı için bu kısımda Evaluators devreye girmektedir. Oluşturulan çizimin düzenli bir şekilde işlemesi ve ilerlemesini sağlamaktadır.

    Köşe İşlemleri(Per- Vertex Operations)
    Köşe verilerinin 4*4 floating-point matrixlerine dönüştürülerek oluşturulan mekansal koordinat sisteminin, 3D dünya koordinat sistemine uyarlandığı bölüme köşe işlemleri denmekte dir. Eğer gelişmiş özellikler etkinse bu işlemin yükü daha da coğalmaktadır. Örnegin texture doku kaplama özelliği aktif ise doku koordinatları ve aydınlatma (lighting) özellikleri, köşe, yüzey normal ışık kaynağı pozisyonu, material özellikleri de bu bölümde hesaplanmaktadır.

    Primitif Montajı(Primitive Assembly)
    Primitive Assembly'nın en önemli görevlerinden biri kırpma işlemi (Clipping), düzlem dışında kalan geometrik kısımların kırpılması gerekmektedir. Nokta, çizgi, çokgenlerin, kırpma işlemi (Clipping) sırasında, nokta için kırpma işlemi basit olmasına rağmen çizgi çokgen gibi geometrik kısımlar için farklı algoritmalar uygulanmaktadır. Bazı durumlarda uzakta olan objelerin daha küçük gözükmesi yakında olan objelerin görünür olması gerekmektedir. Bu kısım perspective division işlemi ile halledilmektedir, daha sonra bakış açısı ve derinlik (z-koordinat) sistemi uygulanmaktadır. Renk derinliği, doku koordinat değerleri gibi işlemlerin kırpılmaları ile devam etmektedir.

    Pixel İşlemleri(Pixel Operations)
    Opengl'de geometrik nesneler boru hattı üzerinden bir yol almasına nazaran, pixel işlemleri daha farklı bir yol izlemektedir.
    Sistem içersinde dizi halinde tutulan veri çözülerek, uygun bir bileşen durumunu alır. Daha sonra veri pixel haritası (pixel map) ile ölçeklenir(scaled biased), devamında doku bellege yazılır ve pikselleştirme işlemi (Rasterization) gerçekleşir.
    Bu işlem sırasında şu aşamalar gerçekleşir; (ölçekleme, haritalama(mapping), sıkıştırma), daha sonra bu sonuçlar paketlenerek uygun bir biçime dönüştürülür. Bu işlemler framebuffer veya texture buffer'a yazılmadan yapılmaktadır.

    Texture Assembly
    OpenGL'de geometrik nesneler üzerine doku kaplama işleminin gerçekleştigi bölüm.

    Pixelleştirme (Rasterization)
    Pixelleştirme geometrik nesnelerin ve pixellerin dönüştürüldüğü bölümdür.Her parça kare kare framebuffer da bir pixel karşılığını bulur. Çizgi, çokgen, çizgi genişliği, nokta büyüklüğü, gölgeleme, kapsam hesaplamaları, renk derinlik değerleride burada atanır.

    Fragment İşlemleri(Fragment Operations)
    Yapılan işlemlerin framebuffer'a yüklemeden önce bir takım değişikliklerin yapılabileceği alandır. Bir başka deyişle, 'GLEnable' ve 'GLDisable' fonksiyonları ile bazı değişiklikleri, etkin veya devre dışı bırakabileceğimiz bölüm. Örneğin doku elemanları ile doku belleği oluşturularak sis hesaplamaları, Scissor, Alpha, Stencil, Depth-buffer testleri gerçekleşir.

    Özetle
    OpenGL arabiriminin bilgisayar ve ekran kartı üzerinde nasıl çalıştığını anlatmaya çalıştım. Umarım keyifli ve bilgilendirici bir yazı olmuştur.

    Referans:
    http://www.songho.ca/opengl/gl_pipeline.html
    http://openglturk.blogspot.com.tr/2014/04/opengl-boru-hattrendering-pipeline.html
    http://eryms.com/c-opengl-01-giris/
    http://www.godoro.com/Divisions/Ehil/Mahzen/Programming/OpenGL/txt/html/document_Introduction.html

    Hiç yorum yok:

    Yorum Gönder