Autor Wątek: [OpenGL] TV noise - animacja  (Przeczytany 715 razy)

Offline slowbro

  • Użytkownik

# Wrzesień 06, 2017, 20:09:02
Cześć

Mam wygenerowaną teksturę, której każdy punkt ma inny kolor od punktu sąsiedniego. W ten sposób mam coś jakby teksturę z noisem. Wiecie jak można uzyskać efekt animowanego TV noise tzw "śnieżenie ekranu" bez shaderów? Wygenerować drugą teksturę i na zmianę wyświetlać z pierwszą? Czy może w pętli dla każdej ramki wypełniać teksturę losowymi wartościami szarego koloru?

Pozdro

Offline Mr. Spam

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

Offline Sarann

  • Użytkownik

# Wrzesień 06, 2017, 20:14:13
Może podziel teksturę na 16 części, a następnie rysuj je na ekranie w losowej kolejności.

Edit:
Jednak jako, że jestem przeciwnikiem losowości w grach, proponuję zamiast tego ustawić ręcznie paręnaście wzorów (kolejności wyświetlania), a następnie wyświetlać je kolejno.
« Ostatnia zmiana: Wrzesień 06, 2017, 20:16:02 wysłana przez Sarann »

Offline Mergul

  • Użytkownik

# Wrzesień 06, 2017, 21:56:50
Cytuj
Jednak jako, że jestem przeciwnikiem losowości w grach, proponuję zamiast tego ustawić ręcznie paręnaście wzorów (kolejności wyświetlania), a następnie wyświetlać je kolejno.
Kurcze. Czuję delikatnie sarkazm :D Powoli zaczynam sie gubić kiedy żartujesz, a kiedy serio :P

Offline Sarann

  • Użytkownik

# Wrzesień 06, 2017, 23:52:33
Wybacz. Zażartowałem sobie z siebie :)
Muszę zacząć pisać bardziej serio w postach.

Offline JasonVoorhees

  • Użytkownik
    • The Immortal Life of the Son of Jay

  • +3
# Wrzesień 07, 2017, 09:22:43
A może by tak ustawiać losowe TexCoordy? Załaduj teksturę bez właściwości GL_CLAMP_TO_EDGE (czyli chyba z GL_REPEAT), i w funkcji glTexCoord2d zmieniaj o losowe wartości w każdej klatce (glTexCoord2d(zwykły_x + losowy_x, zwykły_y + losowy_y), wszystkie 4 texcoordy powinny dodawać losowy x i y).
« Ostatnia zmiana: Wrzesień 07, 2017, 09:27:22 wysłana przez JasonVoorhees »

Offline wezu

  • Użytkownik

  • +3
# Wrzesień 07, 2017, 12:14:25
A może by tak ustawiać losowe TexCoordy? Załaduj teksturę bez właściwości GL_CLAMP_TO_EDGE (czyli chyba z GL_REPEAT), i w funkcji glTexCoord2d zmieniaj o losowe wartości w każdej klatce (glTexCoord2d(zwykły_x + losowy_x, zwykły_y + losowy_y), wszystkie 4 texcoordy powinny dodawać losowy x i y).
To jest bardzo dobry pomysł. Jeśli to mają być 'mrówki' jak na starym telewizorze kineskopowy to warto wziąć pod uwagę jak to ustrojstwo działało - jest tam działo elektronowe, które rysuje obraz linia po linii i jak dodać do tego szum to wychodzi coś na kształt interferencji (ot taki wzór moire) - jeśli wzór szumu będzie poruszał się miarowo w górę lub w dół (raczej w jednym kierunku niż  w obu i raczej w stałym tempie niż losowo) a jednocześnie szybko i losowo w prawo-lewo to powinno się uzyskać podobny efekt.

Jeszcze jedną właściwością starych telewizorów, którą można wykorzystać by obraz był bardziej realistyczny to przesunięcie warstw w kolorach o 1 pixel (albo i więcej). Szum wygenerujesz raz w skali 0-1 (czy tam 0-255) i zapiszesz w tej formie jako czerwony kanał, przesuniesz wszystko o jeden w prawo i zapiszesz jako zielone i jeszcze raz dla niebieskiego
Szary szum vs szum z 'aberracją chromatyczną':

 
(to akurat kiepski szum, ale chodzi o idee :P)

Offline slowbro

  • Użytkownik

# Wrzesień 09, 2017, 12:11:33
Dziękuję za wszystkie odpowiedzi! Podaliście fajne propozycje rozwiązań.

Offline slowbro

  • Użytkownik

# Październik 14, 2017, 01:18:36
@JasonVoorhees: Super sposób, bardzo prosty w realizacji i działa bardzo ładnie. W funkcji rysującej quada ze zbindowaną noisową teksturą dodałem do glTexCoord2f losowe generowanie jak poniżej:

glBegin(GL_QUADS);
glTexCoord2f(0.0 + rand()%400, 0.0 + rand()%400); glVertex3f(-15.0, -15.0, 0.0);
glTexCoord2f(0.0 + rand()%400, 1.0 + rand()%400); glVertex3f(-15.0, 15.0, 0.0);
glTexCoord2f(1.0 + rand()%400, 1.0 + rand()%400); glVertex3f(15.0, 15.0, 0.0);
glTexCoord2f(1.0 + rand()%400, 0.0 + rand()%400); glVertex3f(15.0, -15.0, 0.0);
glEnd();

Wątek do zamknięcia.
« Ostatnia zmiana: Październik 21, 2017, 01:53:35 wysłana przez slowbro »