Jak renderować teksturę częściowo przezroczystą?

13

Dzień dobry StackOverflow, mam teraz pewien problem, ponieważ nie mogę znaleźć sposobu na renderowanie przezroczystej części tekstury za pomocą OpenGL.

Oto moje ustawienie: mam quada reprezentującego ścianę pokrytą tą teksturą (przekonwertowaną na PNG do celów przesyłania). Oczywiście chcę, aby ściana była nieprzezroczysta, z wyjątkiem tafli szkła. Za ścianą jest inny samolot, który ma pokazywać krajobraz. Chcę zobaczyć krajobraz zza okna. Każda tekstura to TGA z kanałem alfa.

Najpierw renderowany jest „krajobraz”, a następnie ściana. Myślałem, że wystarczy osiągnąć ten efekt, ale najwyraźniej tak nie jest. Część okna, która powinna być przezroczysta, jest czarna, a krajobraz pojawia się tylko wtedy, gdy przechodzę obok ściany.

Próbowałem bawić się przy pomocy GLBlendFunc () po jej włączeniu, ale wydaje się, że to nie działa.

Czy zapominam ważny krok?

Dziękuję Ci :)

megamoustache
źródło
Witaj, witaj w gdse. Wprowadziłem niewielką edycję, nie lubimy umieszczać tagów w pytaniach, które mają dużo nagłówków (szczególnie, gdy używasz tego samego tagu :) I na twoje pytanie. Czy używasz stałego potoku lub własnych shaderów?
Notabene,
Dziękuję za edycję. Nie jestem pewien znaczenia „ustalonego potoku”, ale buduję każdy wierzchołek ręcznie i nie używam żadnego modułu cieniującego. Jeśli to ma znaczenie, nie używam ostatniej wersji openGL, ponieważ jest to zadanie szkolne (myślę, że to openGL 3).
megamoustache
Byłoby wspaniale, gdybyś mógł dołączyć zdjęcie do swojego pytania. Wygląda na to, że zniknął z pierwotnej lokalizacji.
LUB Mapper

Odpowiedzi:

19

Oprócz wszystkiego, co powiedziałeś (tekstury z kanałami alfa, rysowanie krajobrazu przed rysowaniem ściany + okna), musisz także zrobić dwie dodatkowe rzeczy.

Najpierw musisz włączyć funkcję mieszania OpenGL:

glEnable(GL_BLEND);

Po drugie, musisz powiedzieć OpenGL, jak obliczyć kolory zmieszanych pikseli (nawiasem mówiąc, które OpenGL nazywa „fragmentami”). W takim przypadku wystarczy coś prostego:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Po włączeniu mieszania OpenGL połączy kolory pikseli zgodnie z parametrami funkcji podanymi w glBlendFunc. W szczególności zrobi to „source.color * source.alpha + destination.color * (1-source.alpha)”, gdzie „source” to aktualnie renderowana tekstura, a „destination” to kolor już w framebuffer (krajobraz). Więc gdziekolwiek twój kanał alfa jest biały, dostaniesz kolor ściany, a gdziekolwiek kanał alfa jest czarny, dostaniesz kolor krajobrazu. Jeśli kanał alfa jest szary, pojawi się efekt przejścia między dwoma kolorami.

Jeśli twoje okno jest w pełni przezroczyste, istnieją inne sposoby, aby to zrobić, w którym kolejność rysowania dwóch wielokątów nie jest ważna, ale zaczyna wchodzić w bardziej zaawansowane pojęcia, takie jak progi alfa. Prawdopodobnie nie jest potrzebny w twojej obecnej sytuacji.

Trevor Powell
źródło