2010-05-22 16 views
5

Próbuję łączyć tekstur, które mają przezroczyste obszary:Mieszanie przezroczyste tekstury z głębi

glEnable(GL_TEXTURE_2D); 
glBindTexture(GL_TEXTURE_2D, ...); 
glVertexPointer(2, GL_FLOAT, 0, ...); 
glEnable (GL_BLEND); 
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Chyba dodam glDisable (GL_DEPTH_TEST), przezroczyste części najlepszych tekstur nadpisać wszystko pod nimi (zamiast mieszania). Czy jest jakiś sposób, aby to zrobić bez wyłączania głębokości? Próbowałem różnych funkcji mieszania, ale żadna z pomógł.

Odpowiedz

7

Włączenie testu głębi nie powoduje rzeczywistej zmiany geometrii w zwykłej obudowie GL_LESS, uniemożliwia jedynie rysowanie prymitywów, jeśli nie są one bliżej przeglądarki niż poprzednio narysowane. Umożliwia to narysowanie nieprzezroczystej geometrii w dowolnej kolejności, a mimo to uzyskanie pożądanego wyniku, ale prawidłowe renderowanie mieszanej geometrii zwykle wymaga już wszystkiego, co znajduje się za wymieszanym obiektem.

Oto, co należy robić, aby uzyskać mieszankę geometrii nieprzezroczystym i mieszane spojrzeć w prawo:

  1. oddzielić mieszane geometria z nieprzezroczystego geometrii.
  2. Posortuj mieszaną geometrię od tyłu do przodu.
  3. Najpierw jak zwykle narysuj całą nieprzezroczystą geometrię.
  4. Narysuj mieszaną geometrię w posortowanej kolejności. Opcję testowania głębokości należy włączyć, ale tymczasowo wyłączyć zapisywanie głębokości za pomocą glDepthMask(GL_FALSE).

Jeśli zawartość jest zawsze całkowicie nieprzezroczysta lub całkowicie przezroczysta, można po prostu włączyć testy alfa i wyłączyć mieszanie, ale domyślam się, że nie tego właśnie szukasz.