Autor Wątek: Tekstura jak śnieżący ekran  (Przeczytany 1987 razy)

Offline slowbro

  • Użytkownik

# Lipiec 16, 2016, 01:42:38
Witam

Rozpoznaję trochę teraz zagadnienie generowania tekstur za pomocą różnych algorytmów w openGL. Za pomocą jakiego algorytmu można wygenerować teksturę przypominającą "śnieżący ekran" jak na telewizorze? Interesuje mnie uzyskanie efektu porozrzucania i pomieszania czarnych oraz białych pikseli jak na ekranie TV.

Dziękuję z góry za odpowiedzi

Offline Mr. Spam

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


Offline slowbro

  • Użytkownik

# Lipiec 16, 2016, 02:09:44
Nie znam GLSL. Nie ma coś pod c++ i Opengl?

Offline JasonVoorhees

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

# Lipiec 16, 2016, 02:44:05
Teksturę OpenGL tworzysz z bufora. Więc zapełnij ten bufor losowymi wartościami kolorów. Resztę robisz tak samo jak przy każdej innej teksturze.

Przy wyświetlaniu tej tekstury na czworokącie po prostu podawaj odpowiednio spreparowane losowe wartości do funkcji glTexCoord2d(); żeby wyswietlać tą samą teksturę przemieszczoną o losową wartosc.

Offline slowbro

  • Użytkownik

# Lipiec 16, 2016, 02:50:51
Potrzebuje teksturę dwukolorową tylko czarny i biały. No właśnie tylko według jakiego algorytmu losowo porozrzucać czarne i biały pixele w teksturze?:)

Offline Mergul

  • Użytkownik

# Lipiec 16, 2016, 10:34:05
Nie znam GLSL. Nie ma coś pod c++ i Opengl?
To radziłbym się jego nauczyc. Jest podobny do C++ tylko, że pisze sie  nim programy cieniujace. Dużo ułatwiłoby Ci to sprawę z OpenGL-em.

Offline JasonVoorhees

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

# Lipiec 16, 2016, 14:09:53
Potrzebuje teksturę dwukolorową tylko czarny i biały. No właśnie tylko według jakiego algorytmu losowo porozrzucać czarne i biały pixele w teksturze?:)
Iterujesz po buforze trójkami (3 kolory, czerwony, zielony, niebieski) i w zależności od wartości losowej liczby ustawiasz kolor na biały (1, 1, 1) lub czarny (0, 0, 0).

Bufor/obraz może mieć różne rozmiary, załóżmy, że bufor ma 256x256, więc rozmiar bufora to 256*256*3 (każdy piksel ma 3 kolory).
więc tworzysz:

unsigned char bufor[] = new unsigned char [256*256 * 3];
// wypełniasz bufor jak napisałem wcześniej i robisz wszystko co potrzeba do utworzenia tekstury (bind, gen itp.)
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 256, 256, 0, GL_BGR, GL_UNSIGNED_BYTE, bufor);
« Ostatnia zmiana: Lipiec 16, 2016, 14:11:30 wysłana przez JasonVoorhees »

Offline pablop

  • Użytkownik

# Lipiec 16, 2016, 16:58:23
https://drive.google.com/file/d/0B07ZgqyC3tHGbjVMY2djSDVPYkE/view

: gif jak sniezacy ekran - moze sie do czegos przyda.

Pozdr

Offline koirat

  • Użytkownik

# Lipiec 16, 2016, 17:17:30
Zastanawia mnie czy wystarczyła by jedna tekstura szumu którą byśmy obracali wertykalnie i horyzontalnie. Dodatkowo można by wprowadzić rotacje o 90 stopni.

Aby otrzymać wiarygodny efekt szumu telewizyjnego.

Offline hashedone

  • Użytkownik

  • +3
# Lipiec 16, 2016, 19:50:26
Nie znam GLSL. Nie ma coś pod c++ i Opengl?
GLSL jest częścią OpenGL i jeśli coś jest z użyciem GLSL to jest to właśnie pod OGL. Nie da się dzisiaj programować w (w miarę nowoczesnym) OpenGLu bez korzystania z GLSL. I przez "w miarę nowoczesny" nie mam na myśli nowinek technologicznych z ostatnich pięciu lat - OGL 3.0 (gdzie już fixed pipeline było przestarzałe) to technologia z 2008 roku - a już dużo wcześniej preferowało się shadery nad FP. OpenGL bez shaderów to technologia sprzed ponad dekady i jej nauka nie ma żadnego sensu.

Offline MrKaktus

  • Użytkownik

# Lipiec 19, 2016, 18:08:33
Iterujesz po buforze trójkami (3 kolory, czerwony, zielony, niebieski) i w zależności od wartości losowej liczby ustawiasz kolor na biały (1, 1, 1) lub czarny (0, 0, 0).

Bufor/obraz może mieć różne rozmiary, załóżmy, że bufor ma 256x256, więc rozmiar bufora to 256*256*3 (każdy piksel ma 3 kolory).
więc tworzysz:

unsigned char bufor[] = new unsigned char [256*256 * 3];
// wypełniasz bufor jak napisałem wcześniej i robisz wszystko co potrzeba do utworzenia tekstury (bind, gen itp.)
glTexImage2D(GL_TEXTURE_2D, 0,GL_RGB, 256, 256, 0, GL_BGR, GL_UNSIGNED_BYTE, bufor);
Skoro chce miec bitmape (zalozmy ze greyscale 256 odcieni zamiast tylko 2), to bez sensu jest marnowac pamiec i robic to o czym piszesz. Czemu nie stworzyc buforu o rozmiarze 256^2, przeiterowac po nim forem i do kazdego uint8[ i ] przypisac rand(255). Potem wyslac to do OpenGL jako teksture R8 i tyle.

Offline slowbro

  • Użytkownik

# Lipiec 31, 2016, 23:27:06
Dziękuję wszystkim za odpowiedzi. Udało się wygenerować fajną teksturę:)