Autor Wątek: Fade-in fade-out w openGL  (Przeczytany 1711 razy)

Offline Willard

  • Użytkownik
    • Seventhtear

# Styczeń 04, 2007, 23:18:37
Jak w temacie.
Jak uzyskać efekt wygasania i pojawiania sie w OpenGL?
Jakaś podpowiedź, bo grafikiem to ja nie jestem.

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Hadrian W.

  • Użytkownik
    • Homepage

# Styczeń 04, 2007, 23:43:18
Podpowiedz - mnozenie koloru
Najprosciej - glColor4f(alpha, alpha, alpha, 1.0f); alpha to zmienna, ktora zmienia sie z czasem. Jezeli dazy do 0 to calosc sie sciemnia, do 1 rozjasnia sie.
Albo mozna uzyc alpha blendingu

Offline Reg

  • Administrator
    • Adam Sawicki - Home Page

# Styczeń 05, 2007, 13:16:19
Jeśli masz na myśli rozjaśnianie do biagłego albo ściemnianie do czarnego koloru całej zawartości ekranu, to na koniec rysowania w każdej klatce trzeba narysować pokrytego jednolitym kolorem quada (dwa trójkąty czy tam czwrorokąt, skoro mowa o OpenGL). Ten quad powinien być rozciągnięty na cały ekran, mieć odpowiedni kolor (biały albo czarny) i odpowiednią wartość alfa, czyli półprzezroczystości (zwiększaną bądź zmniejszaną w czasie płynnie od 0 do 1 czy tam od 1 do 0). Oczywiście musi być włączony alfa-blending i odpowiednio ustawione SRCBLEND i DESTBLEND (jakkolwiek to się tam w OpenGL nie nazywało). Konkretnych stanów nie podaję, bo to można zrealizować na kilka sposobów - pokombinuj :)

Offline slowbro

  • Użytkownik

# Lipiec 05, 2017, 00:25:32
Cześć

Podepnę się pod ten wątek bo mam podobne zagadnienie jak wyżej. Testuje obecnie działanie blendingu. Na części ekranu mam rozciągnięty quad koloru niebieskiego (alpha =1). Zależy mi, aby stopniowo stawał się przezroczysty (alpha = 0). Oto funkcja fade(), której zadaniem jest wyświetlenie znikającego kwadratu:

void fade()
{
glLoadIdentity();
glTranslatef (1.0f, 0.0f, -3.0f);

glPolygonMode(GL_FRONT, GL_FILL);
glPolygonMode(GL_BACK, GL_FILL);

//glDisable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

for (GLfloat alpha = 1.0; alpha >= 0.0; alpha -= 0.005)
{
glColor4f(0.0, 0.0, 1.0, /*1.0*/ alpha);

glBegin(GL_QUADS);         
glVertex3f(-1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, -1.0f, 1.0f);
glVertex3f( 1.0f, 1.0f, 1.0f);
glVertex3f(-1.0f, 1.0f, 1.0f);
glEnd();
}

glDisable(GL_BLEND);
//glEnable(GL_TEXTURE_2D);

glPolygonMode(GL_FRONT, GL_LINE);
glPolygonMode(GL_BACK, GL_LINE);
}

Funkcja znajduje się z głównej pętli rysującej. Zamiast znikającego stopniowo niebieskiego kwadratu, przezroczystość jego nie zmienia się. Cały czas jest widoczny niebieski kwadrat. Same atrybuty blendingu glEnable(GL_BLEND) oraz glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA) są poprawne, ponieważ jak wykomentuję pętle "for" i ustawię alfa = 0.5 w linii glColor4f(0.0, 0.0, 1.0, 0.5) to na ekranie jest widoczny półprzezroczysty niebieski kwadrat. Proszę o wskazówki co może być przyczyną braku znikania kwadratu.
« Ostatnia zmiana: Lipiec 05, 2017, 00:27:42 wysłana przez slowbro »

Offline slowbro

  • Użytkownik

# Lipiec 07, 2017, 23:03:57
Cisza?:)

Offline ekicam2

  • Użytkownik

# Lipiec 07, 2017, 23:11:38
Fade musisz wywoływać co ramkę. Obecnie zanim wyrysujesz to już for przeleci.

Offline slowbro

  • Użytkownik

# Lipiec 09, 2017, 01:32:59
Jest jakiś sposób, aby można było kontrolować czas przez jaki trwa fade-in oraz fade-out? Np. pierwszy trwa 0,5 sekundy a drugi 2,5 sekundy.
« Ostatnia zmiana: Lipiec 09, 2017, 02:51:31 wysłana przez slowbro »

Offline ekicam2

  • Użytkownik

# Lipiec 09, 2017, 06:09:19
Jasne to już zależy od ciebie, będziesz potrzebował informacji ile ma trwać przyjście i ile już czasu minęło, następnie https://en.m.wikipedia.org/wiki/Linear_interpolation i gotowe!
W razie czego pytaj śmiało!

Offline slowbro

  • Użytkownik

# Lipiec 09, 2017, 10:50:40
Dzięki za wskazówki, poeksperymentuje później:) Dodam od siebie jeszcze ciekawy artykuł powiązany z zagadnieniem http://xion.org.pl/productions/texts/coding/game-programming/real-time-loop/

Offline slowbro

  • Użytkownik

# Lipiec 28, 2017, 19:07:32
@ekicam2: Jest może jakiś prostszy sposób bez przeliczania czasów le ma trwać przyjście i ile już czasu minęło i interpolacji?
« Ostatnia zmiana: Wrzesień 03, 2017, 02:54:26 wysłana przez slowbro »

Offline slowbro

  • Użytkownik

# Wrzesień 05, 2017, 00:02:50
Nikt nie ma żadnego pomysłu?:)

Offline Sarann

  • Użytkownik

# Wrzesień 05, 2017, 00:24:20
Na cpp0x masz już całkiem wystarczające odpowiedzi w swoim temacie ;)

Niezły odkop swoją drogą, 10 lat... szmat czasu.