Sis ( Fog )

1.Bölüm: Basit Sis 

Bu bölümde OpenGL ile basit bir sisin nasıl yaratıldığını öğreneceğiz. OpenGL'de sisin arkasındaki temel mantık;Ekrana bir piksel çizildiğinde, bu pixel ile rengin(gri) yoğuşturulmasıdır. Kameraya yakın pikseller daha az gri renk yoğunluğuna sahipken,Kameraya daha uzak pikseller daha yüksek gri renk yoğunluğuna sahip olacaklar. 0 yoğunluğunda sis olmaz iken 1 yoğunluğunda göz gözü görmez.


İlkin bir OpenGL özellik-modunun aktif edilmesi için yapıldığı gibi Sisin aktif edildiğini(kullanılacağını) OpenGL'e söylemek için glEnable(özellik) fonksiyonu çağrılmalı.

Özelliğin aktif edilmesi:
glEnable(GL_FOG);

Sonra OpenGL'e, kullanmak istediğimiz sisin niteliğini tanımlamalıyız, mesela renk, yoğunluk hesaplama şekli ve ermin vs. Bu nitelikler glFog_(nitelik,değer) fonksiyonu ile bildirilir.

Sis rengini bildirmek:
GLfloat SisRengi[] = {0.5f, 0.5f, 0.5f, 1};// Bu belirtilen Red,Green,Blue,Alpha değerleri bize Gri rengi(sis rengi) elde ettirecek.
glFogfv(GL_FOG_COLOR, SisRengi);//Sis rengini set et

Aslında mesela çölde bir kum bulutu yaratmak istiyorsak SisRengi'ni sarımtırak bir renk seçebiliriz veya başka bir atmosfer için başka bir renk(toz bulutu, kirlilik,duman vs.).



Sis modunu(yoğunluk hesaplama şekli) bildirmek:
glFogi(GL_FOG_MODE, GL_LINEAR);//yoğunluk hesaplama modu doğrusal olsun

Ayrıca iki tür hesaplama şekli daha var (üssel: GL_EXP ve GL_EXP2). Farklı sis modlarında, mesafe ve yoğunluk arasındaki değişim aşağıdaki grafikte gösterilmiştir.




Hesaplamaları şöyledir:

f(sisyoğunluğu)
end(kamera önünde sislenmenin bitirildiği uzak odak)
start(kamera önünde sislenmenin başlatıldığı yakın odak)
z(orjinden sislenen bölüme göz koordinatlarında uzaklık)
density(kat=pozitif olmalı ve ilklenik değeri 1'dir. Değeri değiştirmek için glFogf(GL_FOG_DENSITY, 0.05f))

olmak üzere;

GL_LINEAR için:
f= (end−z)/(end−start)

GL_EXP için:
f=e−(density·z)

GL_EXP2 için:
f=e−(density·z)2


Sis Uygulama(performans) şeklini bildirmek:
glHint (GL_FOG_HINT, şekil);

şekil:
GL_NICEST - piksel başına sis yapılır (güzel görünür)
GL_FASTEST - vertex başına sis yapılır (hızlı, ama biraz daha az güzel)
GL_DONT_CARE - Seçimi OpenGL'e bırakır.


Sis Erminini bildirmek:

glFogf(GL_FOG_START, start), glFogf(GL_FOG_END, end) fonksiyonları ile bildirilir.

glFogf(GL_FOG_START, 10.0f);//kameradan 10birim öteden başlayıp
glFogf(GL_FOG_END, 20.0f);//20 birim öteye kadar ermin

Velhasıl tüm yapmamız gereken sahneleme(render) fonksiyonu başına aşağıdaki kodları koymaktır.

GLfloat SisRengi[] = {0.5f, 0.5f, 0.5f, 1};
glFogfv(GL_FOG_COLOR, SisRengi);
glFogi(GL_FOG_MODE, GL_LINEAR);
glHint (GL_FOG_HINT, GL_DONT_CARE);
glFogf(GL_FOG_START, 10.0f);
glFogf(GL_FOG_END, 20.0f);

Tabi daha önce sisi aktif etmeyi unutmamadan.
glEnable(GL_FOG);

2.Bölüm: Shader Uygulamalı 

Birinci bölümde OpenGL'nin eski günlerinden bir örnek sunduk, şimdi ise daha ileri etkileyici uygulama için yeni nesil shader tabanlı uygulamasını ele alacağız.

Devam edecek...