4
OpenGL Genel Bakış Ve İşlem Hattı Giriş OpenGL, grafik donanımları için yazılımsal bir ara yüzdür. Birçok farklı donanım platformuyla kullanılmak üzere donanımdan-bağımsız olarak tasarlandı. OpenGL programları, istemci-server gibi farklı bilgisayar çeşitleriyle bile bir ağ üzerinde çalışabilir(istemci-server paradigması). OpenGL'de istemci, kendinde gerçekten bir OpenGL programının işletildiği bilgisayardır, Ve server, çizimleri yapan bilgisayardır. OpenGL’de, OpenGL çekirdek komutları gl önekini alırken OpenGL Utility Library’deki(OpenGL’nin kendine ait yardımcı kütüphanesi-glu32.lib) komutlar için glu kullanılır. OpenGL sabitleri GL_ ile başlayıp tümü büyük harflidir. OpenGL’de aynı zamanda fonksiyonlara geçilen argüman sayısını ve tipini belirtmek için sonek kullanılır. glColor3f(1.0f, 0.0f, 0.0f);// 3 float sayı ile sahneleme rengini kırmızı olarak set et State Machine(Durum Makinası) OpenGL bir durum makinasıdır. OpenGL'de mod ve özellikler, değiştirilinceye kadar yürürlükte kalır. Çoğu state glEnable() - glDisable() ile aktif veya pasif edilebilir. glIsEnabled() ile bir state’in hali hazırda aktif veya pasif olup olmadığını da kontrol edebilirsiniz. glPushAttrib() - glPopAttrib() ’ı kullanarak mod-özellik yığınına(stack) state kaydedebilir veya geri alabilirsiniz. GL_ALL_ATTRIB_BITS parametresi, mevcut tüm state’leri kayıt edilmesi/geri alınmasında kullanılabilir. Stack sayısı OpenGL ‘de en az 16 ‘dır. (glinfo örneği ile maksimum stack boyutunuza bakın.) glPushAttrib(GL_LIGHTING_BIT); // Bu fonksiyon, state’i değiştirmenin bir yolu olup glDisable(GL_LIGHTING); // glPopAttrib() çağrısıyla glEnable(GL_COLOR_MATERIAL); // en son eklenmiş state’i geri alabilirsiniz glPushAttrib(GL_COLOR_BUFFER_BIT); glDisable(GL_DITHER); glEnable(GL_BLEND); ... // Birşeyler yapılıyor glPopAttrib(); // GL_COLOR_BUFFER_BIT’i geri al glPopAttrib(); // GL_LIGHTING_BIT’i geri al glBegin() ve glEnd() OpenGL'de geometrik primitifleri çizmek için (noktalar, çizgiler, üçgenler ve benzeri temel şekiller), glBegin() - glEnd() arasında vertex listesini belirtebilirsiniz (vertex deyince bir noktanın koordinatı aklımıza gelmeli ama aslında aynı zamanda onun normali,rengi,varsa karşılık gelen doku eşlemesi anlaşılmalı). Bu metot, direkt mod( immediate mode) olarak isimlendirilir. (geometrik primitifleri Vertex array(vertex dizisi) gibi bir başka metot kullanarak da çizebilirsiniz. Yine diğer derste göreceğimiz üzere display list veya vertex buffer object’de kullanılır. Tabi bu çizim metotları vertex datası verilerek çizim için geçerli, yine çizim için birde pixel data geçebiliriz.

OpenGL Genel Bakış Ve İşlem Hattı

  • Upload
    qaz3443

  • View
    2.704

  • Download
    4

Embed Size (px)

Citation preview

Page 1: OpenGL Genel Bakış Ve İşlem Hattı

OpenGL Genel Bakış Ve İşlem Hattı

Giriş

OpenGL, grafik donanımları için yazılımsal bir ara yüzdür. Birçok farklı donanım platformuyla kullanılmak üzere donanımdan-bağımsız olarak tasarlandı. OpenGL programları, istemci-server gibi farklı bilgisayar çeşitleriyle bile

bir ağ üzerinde çalışabilir(istemci-server paradigması). OpenGL'de istemci, kendinde gerçekten bir OpenGL

programının işletildiği bilgisayardır, Ve server, çizimleri yapan bilgisayardır. OpenGL’de, OpenGL çekirdek komutları gl önekini alırken OpenGL Utility Library’deki(OpenGL’nin kendine ait yardımcı kütüphanesi-glu32.lib) komutlar için glu kullanılır. OpenGL sabitleri GL_ ile başlayıp tümü büyük harflidir. OpenGL’de aynı zamanda fonksiyonlara geçilen argüman sayısını ve

tipini belirtmek için sonek kullanılır.

glColor3f(1.0f, 0.0f, 0.0f);// 3 float sayı ile sahneleme rengini kırmızı olarak set et

State Machine(Durum Makinası)

OpenGL bir durum makinasıdır. OpenGL'de mod ve özellikler, değiştirilinceye kadar yürürlükte kalır. Çoğu state glEnable() - glDisable() ile aktif veya pasif edilebilir. glIsEnabled() ile bir state’in hali hazırda aktif veya pasif olup olmadığını da kontrol edebilirsiniz. glPushAttrib() - glPopAttrib() ’ı kullanarak mod-özellik yığınına(stack) state kaydedebilir veya geri alabilirsiniz. GL_ALL_ATTRIB_BITS parametresi, mevcut tüm state’leri kayıt edilmesi/geri alınmasında kullanılabilir. Stack sayısı OpenGL ‘de en az 16 ‘dır. (glinfo örneği ile maksimum stack boyutunuza bakın.)

glPushAttrib(GL_LIGHTING_BIT); // Bu fonksiyon, state’i değiştirmenin bir yolu olup glDisable(GL_LIGHTING); // glPopAttrib() çağrısıyla glEnable(GL_COLOR_MATERIAL); // en son eklenmiş state’i geri alabilirsiniz glPushAttrib(GL_COLOR_BUFFER_BIT); glDisable(GL_DITHER); glEnable(GL_BLEND); ... // Birşeyler yapılıyor glPopAttrib(); // GL_COLOR_BUFFER_BIT’i geri al glPopAttrib(); // GL_LIGHTING_BIT’i geri al

glBegin() ve glEnd()

OpenGL'de geometrik primitifleri çizmek için (noktalar, çizgiler, üçgenler ve benzeri temel şekiller), glBegin() - glEnd() arasında vertex listesini belirtebilirsiniz (vertex deyince bir noktanın koordinatı aklımıza gelmeli ama

aslında aynı zamanda onun normali,rengi,varsa karşılık gelen doku eşlemesi anlaşılmalı). Bu metot, direkt mod(

immediate mode) olarak isimlendirilir. (geometrik primitifleri Vertex array(vertex dizisi) gibi bir başka metot

kullanarak da çizebilirsiniz. Yine diğer derste göreceğimiz üzere display list veya vertex buffer object’de kullanılır. Tabi bu çizim metotları vertex datası verilerek çizim için geçerli, yine çizim için birde pixel data geçebiliriz.

Page 2: OpenGL Genel Bakış Ve İşlem Hattı

glBegin(GL_TRIANGLES); //üçgen çizime başla glColor3f(1.0f, 0.0f, 0.0f); // rengi kırmızı olarak set et glVertex3fv(v1); // v1, v2, v3 ile bir üçgen çiz glVertex3fv(v2); glVertex3fv(v3); glEnd(); //üçgen çizim bitir

OpenGL'de 10 tür primitif vardır; GL_POINTS, GL_LINES, GL_LINE_STRIP, GL_LINE_LOOP, GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS, GL_QUAD_STRIP, ve GL_POLYGON.

Tüm OpenGL komutanlıklarıi glBegin() - glEnd() arasına yerleştirilmez. Sadece bir alt komut kümesi vardır onlar

kullanılabilir; glVertex*(), glColor*(), glNormal*(), glTexCoord*(), glMaterial*(), glCallList(), vs.

glFlush() & glFinish()

OpenGL komutları , bilgisayar giriş/çıkış bufferı gibi hemen uygulanmaz. Bütün komutlar ilkin tamponlarda(buffer) depolanır ve bufferlar dolana kadar icra bekletilir. Yani eğer bir uygulama ağ üzerinde çalışıyorsa, tek bir pakette komutların bir koleksiyonunu yollamak her komutu ayrı ayrı yollamaktan çok daha fazla verimlidir.

glFlush(), bu tamponlardaki bütün komutları boşaltır(temizler) ve tüm bekleyen komutlar tamponların dolmasını

beklenmeden derhal uygulanmaya itilir. Böylece glFlush(), bu çağrıdan sonra yapılan tüm OpenGL

komutanlıklarının kısa bir zamanda uygulamalarını tamamlayacağının garantisini sağlar. Ayrıca glFlush() önceki

icralar tamamlanıncaya kadar beklemez ve Derhal programına dönebilir. Bundan dolayı önceden yapılan

komutlar, tamamlanmamış bile olsa dahası komut yollamada serbestsiniz.

glFinish() , glFlush() ‘nin yaptığı gibi bufferları temizleyip icraya başlatmak için komutları zorlar, Ama glFinish() , diğer OpenGL komutlarını engeller ve bütün icra tamamlanıncaya kadar bekler. Sonuç

olarak, glFinish() , tüm önceden çağrılan komutlar tamamlanıncaya kadar programınıza dönmez. Bu, görevleri

senkronize etmek veya malum OpenGL komutlarının uygulanmasında tam geçilen zamanı ölçmek için kullanılabilir.

Page 3: OpenGL Genel Bakış Ve İşlem Hattı

OpenGL İşlem Hattı(Pipeline)

OpenGL , belli bir düzende işlem evreleri sırasına sahiptir. İki grafiksel malümat, vertex-tabanlı data ve pixel-tabanlı data, bir hat boyunca işleme tabi tutulur ve bir kombinasyon sonucu frame buffera yazılır. OpenGL'nin , işleme tabi tutulan datayı uygulamanıza geri yollayabildiğine dikkat. (kesik çizgili ok). Bu hattın sabit işlevsellikli (fixed functionality) yani hat içinde herhangi aşamaya müdahele edemeyiz. İleriki derslerde shader programlamada(GLSL) göreceğimiz üzere onun hatındaki bazı aşamalarına müdahale edebileceğiz, o yüzden programlanabilir hatta (programmable pipeline) denir.

OpenGL İşlem Hattı

Display List

Display list, tekrari icralar için depolanan(derlenen) OpenGL komutları kümesi. Tüm data, geometri (vertex)

ve pixel data, bir display list’de depolanabilir. Komutlar ve data bir display list'de saklandığından dolayı

performans da gelişir. OpenGL programı ağda çalıştığı zaman, display list kullanarak ağ üzerinde data

iletişim trafiğini azaltabilirsiniz. Display listler server’a ait bir parça olup server makinede bulunduğundan dolayı istemci makine server'ın display list'ine sadece bir defa komutlar ve data

yollamaya ihtiyaç duyar. (daha fazla detay için vertex array , display list, vertex buffer object dersine bakın.)

Vertex Operasyonu

Her vertex ve normal koordinatlar, GL_MODELVIEW matrisi ile dönüştürülür (nesne koordinatlarından göz

koordinatlarına). Aynı zamanda, Eğer aydınlatma aktif edilirse, vertex başına aydınlatma, dönüştürülen

vertex ve normal datası kullanılarak yapılır. Bu aydınlatma hesaplaması vertexin yeni rengini günceller. (daha fazla bilgi için dönüşüm dersine bakın)

Page 4: OpenGL Genel Bakış Ve İşlem Hattı

Primitif Derleme

Vertex operasyonu sonrası, primitifler (çizgi, üçgen , poligon) bir kez de projeksiyon matrisi ile

dönüştürülür Sonra görüş hacmi kırpma düzlemiyle kırpılır; göz koordinatlarından kırpma koordinatlarına. Bundan sonra, 3D sahne pencere koordinatlarına eşlemek için w ile perspektif bölme gerçekleştirilip Viewport(görüntü alanı) dönüşümü uygulanır. Primitif derlemede yapılan son şey, eğer

culling aktif ise, culling testtir.

Pixel Transfer Operasyonu

istemci belleğinden pikseller okunduktan sonra dataya, ölçekleme , eşleme, esnekleme ve germe yapılır. Bu

işlemler, Pixel transfer operasyonu olarak isimlendirilir. Transfer edilen veri ya doku belleğinde depolanır yada direkt fragmanlara ızgaralanır.

Texture(Doku) Belleği

Doku(Texture) imajları, geometrik nesnelere uygulanmak için doku belleğine yüklenir.

Rasterization(Izgaralama)

Rasterization, geometrik ve pixel data ikilisinin fragmana dönüştürümüdür(Vektör imajın bit eşlem forma

çevrimi). Fragmanlar, renk, derinlik, çizgi genişliği, nokta boyu ve antialiasing hesaplamaları(çatallı-pis kısımların yumuşatılması. GL_POINT_SMOOTH, GL_LINE_SMOOTH, GL_POLYGON_SMOOTH) içeren dikdörtgensel bölgelerdir. Eğer tonlama modu GL_FILL ise çokgenin iç pixelleri(alanı) bu aşamada doldurulacak. Her fragman

frame bufferda bir pixele karşılık gelir.

Fragman Operasyonu

Bu, frame buffera piksellerin fragmanlara çevirmek için son süreçtir. Bu aşamada ilk işlem texel üretimidir; Bir doku öğeleri(texel) doku belleğinden oluşturulur Ve her bir fragmana uygulanır. Sonra sis hesaplamaları

uygulanır. Bundan sonra, bir düzende devamdaki çeşitli fragman testleri vardır; Scissor Test , Alpha Test , Stencil Test , Depth Test. Sonunda, bit maske ile blending, dithering (renk üzerine çeşitli operasyonlar), mantıksal operasyonlar ve

maskeleme yapılır ve asıl pixel datası frame buffera depolanır.

Geri Bildirim

glGet*() ve glIsEnabled() komutlarıyla OpenGL’de aktif state’ler ve bilgiler döndürülebilir. Yine , glReadPixels() kullanılarak frame bufferdan pixel datanın dikdörtgensel alanını okuyabilirsiniz, ve glRenderMode(GL_FEEDBACK) kullanılarak dönüştürülmüş vertex data elde edilir. glCopyPixels() belirtilen sistem belleğine pixel datasını döndürmez, Ama başka bir frame buffera geri onları kopyalar, misal ön bufferdan arka buffera.