24 Nisan 2014 Perşembe

Renk Kenetleme,Renk-Endeks Modu,Bir Gölgeleme Modeli Belirlemek

Renk Kenetleme,Renk-Endeks Modu,Bir Gölgeleme Modeli Belirlemek

Renk Kenetleme
OpenGL 3.0 Sürümü, RGBA renk bileşenlerinin gerçek noktalı sayı değerleri olarak saklandığı noktalı sayı çerçeve bellekleri getirdi. Noktalı sayı değerlerinin daha büyük dinamik aralığı nedeniyle aslen OpenGL tarafından 0.0 ila 1.0 olarak tanımlanan kenetlenmiş renk değerleri aralığı dışında kalan renk değerlerine izin vermek isteyebilirsiniz.

void glClampColor(GLenum target, GLenum clamp);

glClampColor glReadPixels sırasında kenetlecek renkleri kontrol eder. Hedef GL_CLAMP_VERTEX_COLOR,GL_CLAMP_FRAGMENT_COLOR,veyaGL_CLAMP_READ_COLOR olabilir. Kelepçe(clamp) GL_TRUE ise, renk sıkıştırma etkin olur; Kelepçe(clamp) GL_FALSE ise, renk sıkıştırma devre dışı . Kelepçe(clamp) GL_FIXED_ONLY ise, renk sıkıştırma seçilen okuma tamponu noktası bileşenleri sabit ve aksi kapatmıştır.

OpenGL Sürüm 3.0 mevcut olan renk-kenetleme seçenekleri  aşagıdaki tabloda’de verilmektedir.



Parametre
Özellikler
  • GL_TRUE
Renkler [0, 1] aralığına kenetlenmeli
  • GL_FALSE 
Kenetlenmeyecek renkler
  • GL_FIXED_ONLY
Renkler sadece hedef çerçeve bellek sabit nokta ise
Kenetlenir.
Renk-Endeks Modunda Bir Rengi Belirlemek
glIndex
Renk-endeks modunda tek-değerli bir renk endeksini geçerli renk endeksi olarak seçmek için glIndex*()  komutunu kullanılır.

Void glIndex{sifd ub}(TYPE c);
Void glIndex{sifd ub}v(const TYPE *c);


Geçerli renk endeksini c’ye ayarlanır. Bu komutun ilk soneki parametreler için veri tipini belirler: kısa, tamsayı, noktalı sayı, çift veya işaretsiz bayt. İkincisi, seçeneksel sonek v,  argümanı verilen veri tipinin bir değer dizisi olduğunu gösterir (dizi sadece bir değer içerir.)  

glClearIndex



Pencereyi Temizlemek” kısmında glClearColor() komutunun özelliklerini gördünüz. Renk-endeks modu için buna karşılık gelen birglClearIndex() modu bulunur.


void glClearIndex(GLfloat  cindex); 


Geçerli temizleme rengini renk-endeks modunda ayarlanır. Bir renk-endeks mod penceresinde bir glClear(GL_COLOR_BUFFER_BIT) çağrısı belleği temizlemek için cindex kullanır. Varsayılan endeks; 0.0’dır.
Not: OpenGL, renk-bakma tablosuna değer yüklemek için herhangi bir şablona sahip değildir. Pencere sistemleri genel olarak bu tür operasyonlara sahiptir. GLUT pencere-sistemine-özgü komutları çağırmak için glutSetColor() komutuna sahiptir. 


Bir Gölgeleme Modeli Belirlemek

Bir çizgi veya dolu bir poligon primitif tek bir renk (düz gölgeleme) veya pek çok renk (düzgün gölgeleme, ayrıca Gouraud Gölgeleme de denir) ile çizilebilir. Arzu edilen gölgeleme tekniğini glShadeModel() komutu ile belirlenir.


void glShadeModel(GLenum mode);


glShadeModel Gölgeleme modelini ayarlar. Mod parametresi ya GL_SMOOTH (varsayılan) veya GL_FLAT olabilir.
Düz gölgeleme ile bağımsız bir primitifin belli bir köşesinin rengi, bu primitifi kaplamak için tüm primitiflerin köşeleri boyunca çoğaltılır. Düzgün gölgeleme ile her bir köşedeki renk münferit olarak ele alınır. Bir çizgi primitif için çizgi boyunca uzana renkler köşe renkleri arasında ortalanır. Bir poligon primitif için poligon içindeki renkler köşe renkleri arasında ortalanır. 

Örnek Kod:


#include<GL/glut.h>
void init (void)
    {
      
      glClearColor(0.0,0.0,0.0,0.0);
      glShadeModel(GL_SMOOTH);
            
    }
    
    
    void triangle(void)
    {
      glBegin(GL_TRIANGLES);
      glColor3f(1.0,0.0,0.0);
      glVertex2f(5.0,5.0);
      glColor3f(0.0,1.0,0.0);
      glVertex2f(25.0,5.0);
         glColor3f(0.0,0.0,1.0);
      glVertex2f(5.0,25.0);
      glEnd();
    }
    
    void display(void)
    {
      
      glClear(GL_COLOR_BUFFER_BIT);
      triangle();
      glFlush();      
    }
    void reshape(int w,int h)
    {
      glViewport(0,0,(GLsizei)w,(GLsizei)h);
      glMatrixMode(GL_PROJECTION);
      glLoadIdentity();
      if(w<=h)
 gluOrtho2D(0.0,30.0,0.0,30.0 *(GLfloat)h/(GLfloat) w);
      else
      gluOrtho2D(0.0,30.0 *(GLfloat)w/(GLfloat) h,0.0,30.0);
      glMatrixMode(GL_MODELVIEW);
       }
    
    int main (int argc, char ** argv)
    {
      glutInit (&argc,argv);
      glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
      glutInitWindowSize(500,500);
      glutInitWindowPosition(100,100);
      glutCreateWindow(argv[0]);
      init();
      glutDisplayFunc(display);
      glutReshapeFunc(reshape);
      glutMainLoop();
      return(0);
    }



Düzgün gölgeleme ile komşu pikseller biraz daha farklı renk değerlerine sahip olur. RGBA modunda biraz daha farklı değerlere sahip bitişik pikseller benzer görünürler, bu nedenle bir poligon boyunca renk değişimleri kademeli olarak görünür. Renk-endeks modunda bitişik pikseller, renk-endeks tablosunda kesinlikle benzer renklere denk gelmeyen farklı konumlara başvurabilir. Bitişik renk-endeks girişleri oldukça farklı renkler içerebilir bu nedenle renk-endeks modunda düzgün-gölgeli bir poligon sanrısal görünebilir.
 Bu problemden kaçınmak için renk haritasında bitişik bir dizin seti arasında düzgünce değişen renklerden bir renk rampası yaratmak zorundasınız. Bir renk haritasına renk yüklemenin OpenGL yerine pencere sisteminiz yoluyla gerçekleştirildiğini unutmayın. Eğer GLUT kullanıyorsanız belirlenmiş kırmızı, yeşil ve mavi değerlere sahip renk haritasında tek bir endeks yüklemek için glutSetColor() ı kullanabilirsiniz. glutSetColor()  ın ilk argümanı endekstir ve diğerleri kırmızı, yeşil ve mavi değerleridir. Hafifçe farklı sarı tonlara ait 32 bitişik renk dizini yüklemek için (16 ila 47 arası renk dizinleri);
for (i = 0; i < 32; i++) {
glutSetColor(16+i, 1.0*(i/32.0), 1.0*(i/32.0), 0.0);
}
döngüsünü kullanabilirsiniz
Şimdi eğer sadece 16 ila 47 arası renklerden kullanan düzgün gölgeli poligonları kaplıyorsanız bu poligonlar kademeli olarak değişen sarı tonlarına sahip olacaktır.
Düz gölgeleme ile tek bir köşenin rengi tüm bir primitifin rengini belirler. Bir çizgi parçası için çizginin rengi, ikinci (son) köşe tanımlandığından geçerli renktir. Bir poligon için kullanılan renk, aşşagıdaki tabloda gösterildiği gibi belli bir köşe tanımlandığında yürürlükte olan renktir. Tablo, köşe ve poligonların 1.OpenGL’den başlayarak bu kuralları tutarlı şekilde takip ettiğini varsayar ancak bir düz-gölgeli primitifin nasıl çizileceği hakkında belirsizlikten kaçınmanın en iyi yolu pirimitif için sadece bir tek renk belirlemektir.
Poligon Tipi
i.nci Poligon için Renk Seçiminde Kullanılan Köşe
Tek Poligon
1
Üçgen şerit
i+2
Üçgen fan
i+2
Bağımsız Üçgen
3i
Dörtlü şerit
2i+2
Bağımsız dörtlü
4i


Hiç yorum yok:

Yorum Gönder