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))
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.
{
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,-
glVertex2f(-0.4f,-
glEnd();
}
burada sorgulanan durum[0]
Hiç yorum yok:
Yorum Gönder