Bilgisayar Rengi
Bir bilgisayar ekranı üzerinde, donanım ekrandaki her bir pikselin farklı miktarlarda kırmızı, yeşil ve mavi ışık yaymasına neden olur. Bunlara R, G ve B değerleri denir. Çoğunlukla birlikte paketlenirler (bazen alfa veya A denilen dördüncü bir değerle birlikte) ve paketli değere RGB (veya RGBA) denir. Her bir pikseldeki renk bilgisi ya her bir piksel için R,G, B ile muhtemelen A değerlerinin tutulduğu RGBA modunda veya her bir piksel için tek bir sayının ( renk endeksi ) depolandığı renk-endeks modunda tutulabilir. Her bir renk endeksi, belirli bir R, G ve B değerleri seti tanımlayan bir tablodaki bir kaydı gösterir. Böyle bir tabloya renk haritası denir.
Renk-endeks modunda, renk haritasının değerlerini değiştirmek isteyebilirsiniz. Renk haritaları pencere sistemi tarafından kontrol edildiğinden, bunu yapacak hiçbir OpenGL komutu yoktur. Kullandıgınız pencere sitemine göre(glut, winap,vs..) renk-görüntü modunu ayarlamamız gerekmektedir.
Farklı grafik donanım platformları arasında hem piksel dizisi büyüklüğü hem de her bir pikselde gösterilebilecek renk sayısı bakımından büyük bir çeşitlilik söz konusudur. Herhangi grafik sisteminde her bir piksel rengini depolamak için aynı miktarda belleğe sahiptir ve tüm piksellerin tüm belleğine renk belleği denir. Bir belleğin boyutu genellikle bit olarak ölçülür, yani 8 bitlik bellek, her bir piksel için 8 bit veriyi depolayabilir (256 olası farklı renk). Olası belleklerin boyutu makineden makineye değişir. (Çerçeve Arabellek konusunda bu durum incelenmektedir).
R, G ve B değerleri 0.0’dan (hiç yok) 1.0’a (tam şiddet) kadar değişebilir. Örneğin R=0.0, G=0.0 ve B=1.0 olası en parlak maviyi temsil eder. Eğer R, G ve B’nin tümü 0.0 ise ekran tamamen siyah ve eğer hepsi 1.0 ise pikseller ekran üzerinde en parlak beyaz ile çizilir. Yeşil ve maviyi harmanlamak deniz mavisinin tonlarını oluşturur. Mavi ve kırmızı patlıcan moru için karıştırılır. Yeşil ve kırmızı sarıyı verir. R, G ve B bileşenlerinden renkleri oluşturmanıza yardımcı olmak için Tabaka 12’de gösterilen renkli küpe bakın. Bu küpün eksenleri kırmızı, yeşil ve mavinin şiddetlerini temsil etmektedir. Küpün bir siyah-beyaz sürümü Şekil 4.1’de gösterilmektedir.
Bir nesneye (bu örnekte bir noktaya) bir renk tanımlamak için kullanılan komutlar bu kadar basit olabilir:
glColor3f(1.0,0.0,0.0);
glBegin(GL_POINTS);
glVertex3fv(point_array);
glEnd();
Belli modlarda (örneğin ışıklandırma ve biçimlendirme hesaplamaları gerçekleştirilmişse) atanan renk, bir piksel için bir rengi temsil eden bir değer olarak çerçeve belleğine ulaşmadan önce başka operasyonlardan geçebilir. Gerçekte bir pikselin rengi uzun bir operasyon dizisi ile belirlenir.
Bir programın yürütülmesi esnasında başlangıçta renk-görüntü modu ya RGBA modu veya renk-endeks moduna ayarlanır. Renk-görüntü modu başlatıldığı anda artık değiştirilemez. Program çalışırken bir renk (ya bir renk-endeks veya bir RGBA değeri) her bir geometrik primitif için bir köşe-başına temelinde belirlenir. Bu renk sizin bir köşe için açıkça belirlediğiniz bir renktir veya eğer ışıklandırma etkinleştirilmiş ise, dönüşüm matrislerinin yüzey normalleri veya diğer materyal özellikleri ile etkileşimi sonucunda belirlenir. Diğer bir deyişle üzerine mavi ışık düşmüş bir top, hiç ışık almayan bir toptan daha farklı görünür (detaylar için ışık konusuna bakınız). İlgili ışıklandırma hesaplarının yerine getirilmesinden sonra seçili gölgeleme modeli uygulanır. Her biri bir pikselin nihai rengi üzerinde farklı etkilere sahip olan düz veya düzgün gölgelemeyi seçebilir.
Daha sonra primitifler kafeslenir veya bir iki-boyutlu görüntüye dönüştürülür. Kafesleme, pencere koordinatlarında hangi grid karenin primitif tarafından kaplandığını belirlemeyi ve daha sonra bu kareye renk ve diğer değerleri atamayı içerir. Kendisine eşlik eden renk değeri, z-derinliği ve doku koordinatları ile birlikte grid kareye fragman denir. Pikseller, çerçeve belleğin öğeleridir; bir fragman bir primitiften gelir ve yeni bir piksel vermek üzere karşılık gelen pikseliyle birleşiktir. Bir fragman oluşturulduğu anda – eğer etkinleştirilmişlerse – fragmanlara desenleme, sis ve anti-pürüzlenme (antialiasing) uygulanır. Sonrasında her tür belirlenmiş alfa harmanlama, kararsızlaştırma, ve bit-akıllı mantıksal operasyonlar çerçeve belleğinde tutulmuş olan fragman ve pikseli kullanarak yürütülür. Son olarak fragmanın renk değeri (renk-endeksi veya RGBA) piksele yazılır ve pencerenin renk-gösterme modu kullanılarak pencerede gösterilir.
RGBA Gösterme Modu
RGBA modunda, donanım her bir R, G, B ve A bileşeni için belli sayıda (hepsi için aynı olması şart değil) bit düzlem ayırır. R, G ve B değerleri genellikle noktalı sayılar yerine tamsayı olarak tutulurlar ve depolama ve geri çağırma için mevcut bit sayısına ölçeklenirler. Örneğin, eğer bir sistem R bileşeni için 8 bite sahipse 0 ile 255 arasındaki tam sayılar depolanabilir; böylece bit düzlemlerdeki 0, 1, 2, …, 255, 0/255 = 0.0, 1/255, 2/255, …, 255/255 = 1.0 R değerlerine karşılık gelir. Bit düzlem sayısına bakılmaksızın 0.0 minimum şiddeti ve 1.0 ise maksimum şiddeti belirtir.
Not: Alfa değerinin (RGBA’da A) ekranda gösterilen renk üzerinde hiçbir etkisi yoktur. Harmanlama ve şeffaflık dâhil pek çok şey için kullanılabilir ve yazılı olan R, G ve B değerleri üzerinde bir etkiye sahip olabilir. (Alfa değerleri hakkında daha fazla bilgi için bakınız “Harmanlama”).
Tek bir pikselde gösterilebilen farklı renklerin sayısı, bit düzlemlerin sayısı ile donanımın bu bit düzlemlerini yorumlama kapasitesine bağlıdır. farklı renklerin sayısı, n bit düzlemlerin sayısı olmak üzere 2n’i aşamaz. Böylece RGB için 24 bit düzlemi olan bir makine 16,77 milyon farklı renge kadar gösterebilir.
Alıştırma
Bazı grafik donanımlar, belirgin renklerin sayısını artırmak için kararsızlaştırmayı kullanır. Alalaştırma, diğer renklerin etkisini yaratmak için bazı renklerin kombinasyonlarını kullanmaktadır. Alalaştırmanın nasıl çalıştığını canlandırmak için sisteminizin her bir R, G ve B bileşeni için sadece 1 bite sahip olduğunu ve böylece sadece sekiz renk gösterebikeceğini varsayın: siyah, beyaz, kırmızı, yeşil, sarı, deniz mavisi ve patlıcan moru. Bir pembe bölge göstermek için donanım bölgeyi bir dama tahtası tarzında dönüşümlü olarak kırmızı ve beyaz piksellerle doldurabilir. Eğer gözleriniz ekrandan münferit pikselleri ayırt edemeyecek yeteri uzaklıktaysa bölge kırmızı ile beyazın ortalaması, pembe olarak görünür. Kırmızımsı pembeler piksellerin büyük bir kısmının kırmızı ile doldurulmasıyla elde edilebilir, daha açık pembeler daha çok beyaz pikseller kullanabilir ve benzeri.
Bu teknikle orada hiçbir pembe piksel yoktur. “Pembelik” efektini elde etmenin tek yolu çok sayıda pikselden oluşan bir bölgenin kapsanmasıdır – tek bir pikseli alalaştıramazsınız. Mevcut olmayan bir renk için bir RGB değeri belirler ve bir poligonu doldurursanız, donanım poligonun içini ortalamaları gözünüze istediğiniz renk gibi gelen civar renklerin bir karışımı ile doldurur (Buna karşın, eğer piksel değerlerini çerçeve belleğinden okuyorsanız, orada pembe piksel olmadığından fiili kırmızı ve beyaz piksel sayısını alırsınız. Piksel değerlerini okuma hakkında daha fazla bilgi için bakınız (Çizim Pikselleri)).
Yukarıdaki şekilde gri tonları oluşturmak üzere siyah ve beyaz piksellerin bazı basit alalaştırmasını göstermektedir. Soldan sağa doğru üstteki 4x4 düzen %50, %19 ve %69 oranında gri alalaştırma düzenlerini göstermektedir. Her bir düzenin altında, her bir düzenin tekraren küçültülmüş kopyalarını görüyorsunuz ama bu siyah ve beyaz kareler hâlâ çoğu pikselden daha büyüktür. Eğer onlara odanın karşısından bakarsanız birlikte bulanıklaştıklarını ve üç farklı gri ton olarak göründükleri görebilirsiniz.
Her bir R, G ve B için yaklaşık 8 bitle birlikte alalaştırma olmaksızın oldukça yüksek kalitede bir görüntü elde edebilirsiniz. Bununla birlikte makinenizin sırf 24 renk bit düzlemine sahip olması alalaştırmanın istenmediği anlamına gelmez. Örneğin, çift-bellek modunda çalışıyorsanız bit düzlemler 12’lik iki sete bölünebilir, bu nedenle her bir R, G ve B bileşeni için orada gerçekten sadece 4 bit bulunur. Alalaştırma olmadan bileşen başına 4 bit çoğu durumda tatmin edici olmaktan uzak sonuçlar verebilir.
Alalaştırmayı GL_DITHER komutunu glEnable() veya glDisable() ’a göndererek etkinleştirebilir veya pasifleştirebilirsiniz.
Renk-Endeks Görüntü Modu
Renk-endeks modu ile OpenGL, bir sayı-ile-boya ekranı için hazırlamak üzere boyaları karıştırmak için bir palet kullanıma benzer bir renk haritası (veya bakma tablosu) kullanır. Bir ressamın paleti boyaları birbirine karıştırmak için alan sağlar; benzer olarak bir bilgisayarın renk haritası da ilk kırmızı, yeşil ve mavi değerlerin karıştırılabileceği endeksler sağlar.
Bir sayı-ile-boya ekranını dolduran bir ressam renk paletinden bir renk seçer ve ilgili numaralı bölgeleri o renkle doldurur. Bir bilgisayar her bir piksel için renk endekslerini bit düzlemlerde saklar.Daha sonra bu bit düzlem değerleri renk haritasına başvurur ve renk haritasından karşılık gelen kırmızı, yeşil ve mavi değerlerle boyanır.
Renk-indeks modda eş zamanlı mevcut renk sayısı renk haritasının boyutu ve mevcut bit düzlem sayısı ile sınırlıdır. Renk haritasının boyutu donanımın ona ayırdığı miktar ile belirlenir. Renk haritasının boyutu daima 2’nin üssüdür ve tipik boyutlar 256 (28)’den 4906 (212)’ye kadar uzanır, burada üs kullanılmakta olan bit düzlemlerin sayısıdır. Eğer renk haritasında 2n endeks ve m sayıda mevcut bir düzlem varsa kullanılabilir kayıt sayısı 2n artı 2m’den küçüktür.
RGBA modu ile her bir pikselin rengi diğer piksellerin renginden bağımsızdır. Bununla birlikte renk-endeks modunda aynı endeksle kendi bit düzleminde saklanan her bir piksel aynı renk haritası konumunu paylaşır. Eğer renk haritasında bir kaydın içeriği değişirse, o zaman o renk endeksine ait tüm pikseller renklerini değiştirir.
RGBA ile Renk-Endeks Modu arasında Seçim Yapmak
RGBA veya renk-endeks modu kullanma kararınızı hangi donanımın mevut olduğuna ve uygulamanızın gerektirdiklerine dayanarak verin. Çoğu sistem için RGBA modu ile renk-endeks moduna göre daha çok renk eşzamanlı olarak temsil edilebilir. Ayrıca gölgeleme, ışıklandırma, desen haritalama ve sis gibi birkaç efekt için RGBA renk-endeks modundan daha fazla esneklik sağlar.
Aşağıdaki durumlarda renk-endeks modunu seçmeyi isteyebilirsiniz:
- Renk-endeks modundan önemli derecede yararlanan mevcut bir uygulamayı uyarlıyorsanız RGBA moduna geçmemek daha kolay olabilir.
- Eğer az sayıda mevcut bit düzleminiz varsa RGBA belirgin şekilde iri renk tonları yaratabilir. Örneğin eğer sadece 8 bit düzleminiz varsa RGBA modunda kırmızı için sadece 3, yeşil için 3 ve mavi için 2 bite sahip olabilirsiniz. Sadece 8 (23) kırmızı ve yeşil tonuna ve sade 4 mavi tonuna sahip olursunuz. Renk tonları arasındaki değişimin bariz olması çok mümkündür.
Bu durumda, eğer sınırlı gölgeleme gereksiniminiz varsa daha fazla renk tonu yüklemek için renk-bakma tablosunu kullanabilirsiniz. Örneğin sadece mavinin tonlarına ihtiyacınız varsa renk-endeks modunu kullanabilir ve 256 (28) ‘ya kadar mavi tonu renk-bakma tablosunda saklayabilirsiniz ki bu RGBA modunda sahip olabileceğiniz 4 tondan çok daha iyidir. Elbette bu örnek sizin tüm renk-bakma tablonuzu kullanabilir, bu yüzden hiçbir kırmızı, yeşil veya diğer renk bileşiğinin tonlarını içermeyecektir.
- Renk-endeks modu, renk-harita animasyonu ve tabakalar halinde çizim çeşitli hileler için yararlı olabilir.
Genel olarak RGBA’yı mümkün olan her yerde kullanın. Desen haritalama ile çalışır ve ışıklandırma, gölgeleme, sis, anti-pürüzlenme ve harmanlama ile daha da iyi çalışır.
Görüntü Modları Arasında Geçiş
Tüm olası dünyaların en iyisinde, RGBA ile renk-endeks görüntü modu arasında bir seçim yapmaktan kaçınmayı isteyebilirsiniz. Örneğin bir renk-harita animasyon efekti için renk-endeks modu kullanmak ve daha sonra, gerektiğinde, ekranı desen haritalama için hemen RGBA moduna değiştirmek isteyebilirsiniz.
Benzer olarak tekli ve çiftli bellek arasında geçiş yapmak isteyebilirsiniz. Örneğin çok az sayıda bit düzleme, diyelim ki 8 bit düzleme sahip olabilirsiniz. Tekli bellek modunda 256 (28) renginiz olabilir ama eğer animasyonlu programınızdan ışık titreşmelerini yok etmek için çift bellek kullanıyorsanız sadece 16 (24) renginiz olur. Muhtelemen titreşim olmadan hareketli bir nesne çizmek istiyorsunuz ve çift bellek modunu kullanmak için renklerden fedakârlık etmeye hazırsınızdır (belki nesne o kadar hareketlidir ki seyirci detayları fark etmeyecektir.) Ancak nesne durduğunda onu, daha fazla renk kullanabilmek için tekli-bellek modunda çizmek isteyeceksiniz.
Maalesef çoğu pencere sistemi kolay bir geçişe izin vermez. Örneğin Pencere Sisteminde renk-görüntü modu X Visual’ın bir niteliğidir. Bir X-Visual pencere yaratılmadan önce belirtilmelidir. Bir kez belirtildiğinde pencerenin ömrü boyunca değiştirilemez. Bir çift-bellek, RGBA görüntü modunda bir pencere yarattıktan sonra ona bağlı kalırsınız.
Bu problemin hileli bir çözümü, her biri farklı bir görüntü modunda olan birden fazla pencere yaratmaktır. Her bir pencerenin görünürlüğünü kontrol etmek (örneğin bir X penceresi haritalamak veya haritalamamak veya bir Motif veya Athena parçacığını yönetmek veya yönetmemek) ve nesneyi uygun, görünür pencerede çizmek zorundasınız.