Yazar |
Depth Test |
Darklight

Üyelik tarihi 31-10-2002
Mesajlar : 120
OFF-Line
| Yollanan 03-05-2004 at 09:59  
Selam simdi soyle bir gariplik var
eger asagidaki kodda glEnable(GL_DEPTH_TEST) acmassak yüzeylerin renderlenme sirasi Z koordinatina gore yapmadan yapacagi için on yüzeyi gormeniz gereken yerde
arka yüzeyi gorme gibi sorunlarla karsilasirsiniz
/*-------------------------------------------------------------------------------------------
FONKSIYON ISMI:renderTextureBufferedObj
YAPTIGI IS:Ekran Buffered Objelerini Renderler
------------------------------------------------------------------------------------------*/
void renderTextureBufferedObj(entityObj *e){
int ivertexDimension=3;
int itexDimension=2;
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
glBindTexture(GL_TEXTURE_2D, e->texID);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(itexDimension,GL_FLOAT,0,e->pbuffered.t);
glVertexPointer(ivertexDimension,GL_FLOAT,0,e->pbuffered.v);
glDrawArrays(GL_QUADS,0,e->pbuffered.size);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D,0);
glDisable(GL_DEPTH_TEST);
}
ama blending yapiyorsaniz Z bufferi kullanmaniz anlamsız cunku arka yüzeyleri feda edemessiniz ondekilerle belli oranda karismasini istediginiz için onlarinda en geriden öne dogru renderlenmesi gerekir
Z'ye gore en arkadakini Renderle ve fragmente bunun için diyelim ki
Z -100 Pixel R=0, G=200 Blue=100
Z - 70 Pixel R=100, G=0, Blue=0 %60 = Gecirgen
Z - 50 Pixel R=100, G=20, Blue=0 %40 = Gecirgen
bunlari en arkadakinden one dogru tek etk hesaplamasi gerekiyor, OpenGL burda bu sekilde bir yollamı renderliyor.
Asagidaki fonksiyonda baktigimizda
glEnable(GL_DEPTH_TEST) yaptigimizdada sistem
glDisable(GL_DEPTH_TEST) yaptigimizdada farkli bir sonuc vermemekte
yani GL_BLEND aktif oldugunda GL_DEPTH_TEST pek bir ise yaramiyor
otamatik olarak OpenGL tarafından kullanılmıyormu ?
/*-------------------------------------------------------------------------------------------
FONKSIYON ISMI:renderTextureBlendBufferedObj
YAPTIGI IS:Ekran Buffered Objelerini Renderler
------------------------------------------------------------------------------------------*/
void renderTextureBlendBufferedObj(entityObj *e){
int ivertexDimension=3;
int itexDimension=2;
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
glDisable(GL_DEPTH_TEST);
glShadeModel(GL_FLAT);
glBindTexture(GL_TEXTURE_2D, e->texID);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(itexDimension,GL_FLOAT,0,e->pbuffered.t);
glVertexPointer(ivertexDimension,GL_FLOAT,0,e->pbuffered.v);
glDrawArrays(GL_QUADS,0,e->pbuffered.size);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D,0);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
}
|
|
|
  Profil
E-posta
www
Yolla
Düzenle
Gönder
|
MD-C

Üyelik tarihi 26-02-2003
Mesajlar : 582
OFF-Line
| Yollanan 03-05-2004 at 11:16  
Darklight, doğruyu söylemek gerekirse tam okumadım yazını, fakat demek istediğini sanırım anladım (heralde ) GL_DEPTH_TEST olayı ortamda ışık olduğunda hisedilebiliyor ama dediğin gibi Işıksız bir ortamda GL_DEPTH_TEST vamış yada yokmuş pek bir fark yok...
|
|
|
  Profil
www
Düzenle
Gönder
|
Darklight

Üyelik tarihi 31-10-2002
Mesajlar : 120
OFF-Line
| Yollanan 03-05-2004 at 11:55  
Ortamda isik yok demek istedigim
Blending acik oldugunda Depth testiniz acik olsada OpenGL bir sekilde Depth testi es geciyor. Bunu yukarda yaptıgım teslerden anladım. Ama soyle olmasini beklerdim
Depth Test aciksa sistemin blending islemini yapamaması
cunku Pipelinede ilk once Depth Test islemi sonrada Blending islemi yapilmakta diye biliyorum. Bu konuda fikri olan var mı ?
|
|
|
  Profil
E-posta
www
Yolla
Düzenle
Gönder
|
cemuzunlar

Üyelik tarihi 03-08-2003
Mesajlar : 15
OFF-Line
| Yollanan 03-05-2004 at 12:00  
OpenGL bu konuda herhangi bir yardim da bulunmaz. Burada genel yontem soyledir:
- Once opaque( gecirgen olmayan, alphasiz, blending gerektirmeyen ) yuzeyler z-test ve z-write acik olarak cizilir.
- Sonra transparan( gecirgen, alphali, blending gerektiren ) yuzeyler arkadan one dogru siralanir. Blending acilir. Sirali liste z-test ve z-write kapali olarak cizilir. Cizim sirasinda, her yuzey icin blending fonksiyonu, ilgili yuzeyin ciziminden once ayarlanir.
z-test'i acip kapamak icin: glEnable/glDisable( GL_DEPTH_TEST )
z-write'i acip kapamak icin: glDepthMaske( true/ false )
blending'i acip kapamak icin: glEnable/glDisable( GL_BLEND )
blending fonksiyonunu ayarlamak icin: glBlendFunc( ... )
|
|
|
  Profil
www
Yolla
Düzenle
Gönder
|
Black_Knight

Üyelik tarihi 23-10-2002
Mesajlar : 131
OFF-Line
| Yollanan 03-05-2004 at 20:55  
bi yerlerde okumustum eger iki tane seffaf polygon kesişiyorsa bunu halletmek için adamlar polygonları boluyorlardı nasıl yaparsın bilmem tabi :]
----------------- Shadowy Tree | World of Entaria Omnium rerum principia parva sunt.
Oyun Yapimi Irc Kanalı -irc.EnterTheGame.com
#oyunyapimi
|
|
|
  Profil
E-posta
www
Yolla
Düzenle
Gönder
|