2008-11-03 12 views
11

Mamy nadzieję, że jest to proste pytanie: Mam teksturę OpenGL i chciałbym móc zmienić jej przezroczystość, jak to zrobić? Tekstura ma już kanał alfa, a mieszanie działa dobrze, ale chcę zmniejszyć krycie całej tekstury, aby zanikać ją w tle. Spróbowałem z glBlendFunc, ale bez powodzenia - wydaje mi się, że potrzebuję czegoś takiego, jak GL_SRC_ALPHA_MINUS_CONSTANT, które nie jest dostępne. Pracuję na iPhonie, z OpenGL ES.Zmiana przezroczystości tekstury w OpenGL

Odpowiedz

2

Dziękuję wszystkim za pomysły. Grałem zarówno z glColor4f, jak i glTexEnv, i wreszcie zmusiłem się do uważnego przeczytania strony glTexEnv. Strona podręcznika mówi, że w trybie tekstowym GL_MODULATE wynikowy kolor jest obliczany przez pomnożenie przychodzącego fragmentu przez kolor tekstury (C = Cf × Ct), to samo dotyczy alfa. Próbowałem glColor4f (1, 1, 1, nieprzezroczystość) i to nie działało, ale przekazanie pożądanego nieprzezroczystości do wszystkich czterech argumentów wywołania sprawiło, że lewę. (Wciąż nie jestem pewien dlaczego).

+2

I to spowodowało, że zdecydowałeś się zgłosić własną "odpowiedź" jako zaakceptowaną odpowiedź? – zmippie

+0

Tak, ponieważ rozwiązał problem, który miałem. Zapraszam do nieporozumień :) – zoul

+0

Ustawiasz coś nie tak z teksturami. To, co Dan odpowiedział, działa i ma sens, twoje "rozwiązanie" to hack. – cjcela

16

nie mam pojęcia o OpenGL ES, ale w standardzie OpenGL należy ustawić krycie deklarując kolor na fakturze przed użyciem go:

//   R, G, B, A 
glColor4f(1.0, 1.0, 1.0, 0.5); 

Przykład nie daje 50% alfa bez wpływu kolor twojej tekstury. Dostosowując pozostałe wartości, możesz także zmienić kolor tekstury.

+0

Z jakim ustawieniem dla glBlendFunc? – zoul

+2

To zależy od aplikacji, ale zazwyczaj używam: glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); – Dan

+3

Działa to, ponieważ domyślne środowisko tekstur jest ustawione na GL_MODULATE – noop

1

Najprostszym sposobem jest zmiana wartości alfa tekstury w locie. Ponieważ w pewnym momencie informujesz OpenGL o fakturze, będziesz miał bitmapę w pamięci. Po prostu ponownie powiązaj teksturę z tym samym identyfikatorem tekstury. Jeśli nie masz go w pamięci (ze względu na ograniczenia przestrzenne, ponieważ jesteś na ES), możesz odzyskać teksturę do bufora, używając glGetTexImage(). To czyste rozwiązanie.

Operacje zapisywania/pobierania są jednak kosztowne, więc możesz potrzebować innego rozwiązania. Myśląc o tym, możesz pracować z geometrią za geometrią wyświetlającą teksturę lub po prostu pracować nad materiałem/kolorem geometrii, która trzyma teksturę. Najprawdopodobniej będziesz chciał mieć dodatkowe połączenie geometrii tylnej. Korzystanie z glBlendFunc z

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA), 

może być w stanie „łatwo” i - co ważniejsze, tanio - osiągnąć pożądany efekt.

+0

Jeden tekstur jest zwykle używany dla wielu obiektów, zmiana zmieniałaby przezroczystość dla wszystkich obiektów. Ponadto w wielu systemach przesyłanie tekstur jest znacznie wolniejsze niż zwykła operacja kopiowania z powodu konwersji formatu wewnętrznego. – noop

7

Użyj łącznika tekstur. Ustaw etap tekstury, aby wykonać operację GL_MODULATE między teksturą a stałym kolorem. Następnie zmień stały kolor z kodu (glTexEnv, GL_TEXTURE_ENV_COLOR).

Powinno to być "bezpłatne" pod względem wydajności. W większości (jeśli nie we wszystkich) procesach scalania układów scalonych grafiki mają taką samą liczbę cykli GPU (zazwyczaj 1), więc użycie tekstury w przeciwieństwie do operacji modulowania (lub dowolnej innej operacji) ma dokładnie taki sam koszt.

+0

Hmm .. bardzo eleganckie + proste rozwiązanie, NeARAZ. – mstrobl

1

Najprawdopodobniej używasz cg do przeniesienia obrazu do tekstury. Kiedy używasz cg, alfa jest premipliplied, więc dlaczego musisz użyć alpha dla rgba z color4f func.

0

Podejrzewam, że miałeś czarne tło, a tym samym zmniejszając ilość każdego koloru, skutecznie zmniejszałeś kolor do czerni.

2

Zasadniczo masz dwie opcje: użyj glTexEnv dla tekstury za pomocą GL_MODULATE i określ kolor za pomocą glColor4 * i użyj nieprzeźroczystego poziomu dla kanału alfa. Zauważ, że glTexEnv powinien zostać wydany tylko raz, po pierwszym załadowaniu tekstury. Ten scenariusz nie będzie działał, jeśli określisz kolory w atrybutach wierzchołków.Będą mianowicie nadpisać dowolny kolor glColor4 *, który możesz ustawić. W takim przypadku możesz użyć jednej z dwóch opcji: użyj kombinatorów tekstur (zaawansowany temat, niezbyt przyjemny w użyciu w ustalonym potoku) lub "ręcznie" zmień atrybut koloru wierzchołków każdego pojedynczego wierzchołka (może być niepożądany dla większe oczka).

Powiązane problemy