15 Nisan 2014 Salı

Durum yönetim

Durum yönetim

Daha önce durum makinası bölümünde durum yönetimi konusuna deginmiştik şimdi biraz daha geniş ele alalım,Opengl bir çok durum degişkeni tutmaktadır,aydınlatma,doku, yüzey temizleme, sis gibi durum belirleyen fonksiyonların başlangıçta çogu etkin degildir.Bu durumları etkinleştirmek mesela texture mapping render işlemini yavaşlata bilir ancak görüntü kalitesi artacak daha gercekçi görünümler elde edilecektir bu gelişmiş grafik özelliklerini şu iki komut ile açmak kapamak mümkün

void glEnable (GLenum cap);
void glDisable (GLenum cap);

glEnable () belirlenen modu açar glDisable ise belirlenen modu kapatır,glEnable ve glDisable 60 tan fazla mod kullanmaktadır. Örnegin GL_BLEND
reng degerlerini harmanlama olarak belirlenen mod ,GL_DEPTH_TEST derinlik degerlerini karşılaştırma ve güncelleme modu,GL_FOG sis etkisi saglayan mod,GL_LINE_STIPPLE çizgi denetimini saglayan mod,GL_LIGHTING ışık veya aydınlatma modu gibi bir çok mod bulunmaktadır.Ayrıca bunların etkin veya devre dışı olup olmadıgını konturol ede biliceginiz bir komutta vardır.

GLboolean gllsEnabled(GLenum capability);
glIsEnabled komutunun sorgulayacagı modun GL_TRUE veya GL_FALSE degerlerinin döndürülmesiyle pek bi baglantısı yoktur onun yerine alacagı modun aktif olup olmadıgını belirlemektedir bunu bir örnekle inceleyelim


bir çizgi çizelim ve bunu glLineStipple modu ile modifiye edelim hemde bu esnada glIsEnable ile ,GL_LINE_STIPPLE modunu denetlemiş oluruz.

glEnable(GL_LINE_STIPPLE);// GL_LINE_STIPPLE aktif duruma getiriliyor
if(glIsEnabled(GL_LINE_STIPPLE))
/* burada sorgulama yapıyoruz,GL_LINE_STIPPLE aktif ise aşşagıdaki kod çalışacaktır*/
{
glLineStipple(1,0xff);
}
glBegin(GL_LINES);
glColor3f(0.0,0.0,0.0);
glVertex2f(-0.4f,0.4f);
glVertex2f(0.4f,0.4f);
glEnd();


gördügünüz gibi çok basit bir sorgulama yaptık GL_LINE_STIPPLE aktif oldugu için çizilen çizgi glLineStipple komutunda belirlenen parametreler ile modifiye edilecektir.Gördügünüz gibi buradaki durum denetlenmesi on ve off mantıgına dayalı olarak işlemekte.Ancak opengldeki daha karmaşık bazı rutin durum degişkenleri bulunmaktadır.Örnegin glColor bu fonksiyon için kullanılan beş ayrı sorgulama komutu bulunmata

void glGetBooleanv (GLenum pname, GLboolean *params);
void glGetlntegerv (GLenum pname, GLint *params);
void glGetFloatv (GLenum pname, GLfloat *params);
void glGetDoublev (GLenum pname, GLdouble *params);
void glGetPointerv (GLenum GLvoid **params);


glGetBooleanv belirlenen modun true veya false degerlerini sorgulamaktadır,Örnegin


boolean durum;
glGetBooleanv(GL_FOG ,&durum);
if (durum==true)
{
aktif ise çalışması gereken kod
}


glGetlntegerv, glGetFloatv,glGetDoublev,glGetPointerv gibi tamamen veriye dayalı fonksiyonların kullanımıda şu şekildedir.

float durum[4];
glGetFloatv(GL_CURRENT_COLOR,durum);


buradaki (durum) dizisi çizim için belirlenen rengin degerlerini almaktadır

glColor3f(1.0,0.0,0.0);

durum[0] = 1.0
durum[1] = 0.0
durum[2]] = 0.0


glColor3f() çizim rengini kırmızı olarak ayarladık bu verilere dayanarak basit bir sorgulama gercekleştirelim


glColor3f(1.0,0.0,0.0);
float durum[4];
glGetFloatv(GL_CURRENT_COLOR,durum);
if(durum[0]==1.0)
{
glBegin(GL_QUADS);
glVertex2f(-0.4f,0.4f);
glVertex2f(0.4f,0.4f);
glVertex2f(0.4f,-0.4f);
glVertex2f(-0.4f,-0.4f);
glEnd();
}


burada sorgulanan durum[0] 1.0 a eşit oldugu için çizim işlemi gercekleşecektir aksi bir deger sonucu if komutunun içindeki parametreler altlanarak alt satırdan devam edilir.


Hiç yorum yok:

Yorum Gönder