slowbro Temat założony przez niniejszego użytkownika |
[OpenGL] TV noise - animacja » 2017-09-06 19:10:12 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 |
|
pekfos |
» 2017-09-06 19:14:58 Podejrzewam że najszybciej będzie na zmianę wyświetlać twoją teksturę i jej negatyw. |
|
Rashmistrz |
» 2017-09-06 20:26:44 Ja bym wygenerował paręnaście takich tekstur, a potem przypadkowo dobierał, obracał i przesuwał teksturę i opcjonalnie używał negatywu...
Nie zapomnij ustawić powtarzania tekstury, czyli jak tam to było GL_REPEAT przy tex...
Nie pamiętam. :F |
|
kubasuperpl |
» 2017-09-30 11:41:09 Ja coś podobnego zrobiłem w SFML. Kod: #include <iostream> #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include <SFML/System.hpp> #include <time.h> using namespace std; int main() { srand( time( NULL ) ); sf::RenderWindow okno( sf::VideoMode( 640, 480 ), "SFML TV Noise" ); sf::Event event; sf::Image i; i.create( 640, 480 ); sf::Texture t; sf::Sprite s; while( true ) { while( okno.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) { return 0; } } for( unsigned int p = 0; p <= 640; p++ ) { for( unsigned int x = 0; x <= 480; x++ ) { i.setPixel( p, x, sf::Color( rand() % 255 + 1, rand() % 255 + 1, rand() % 255 + 1 ) ); } } t.loadFromImage( i ); s.setTexture( t ); okno.draw( s ); okno.display(); okno.clear(); } }
Może komuś się przyda |
|
Saran |
» 2017-10-02 16:00:01 Nie polecam powyższego. Boli mnie ta wydajność. |
|
pekfos |
» 2017-10-02 17:42:07 Tylko? Ten kod jest też błędny. |
|
Saran |
» 2017-10-02 20:25:58 W sumie racja. Tylko pobieżnie się przyjrzałem. |
|
slowbro Temat założony przez niniejszego użytkownika |
» 2017-10-13 23:58:31 Ciąg dalszy wątku. Mam dwie tekstury: - pierwszą, w której każdy punkt ma inny odcień od sąsiedniego oraz - oraz drugą teksturę będącą negatywem pierwszej tekstury zgodnie z sugestią pekfosa. Napisałem funkcję, która jako argument przyjmuje aktualnie grany wiersz muzyki. Chodzi mi o to, aby wraz ze zmianą wiersza muzyki o jeden wiersz była wyświetlana raz jedne raz druga tekstura. W ten sposób teoretycznie pozwoli to na osiągnięcie animacji coś jak "śnieżenie ekranu". Tekstury są bindowane na quada: raz jedna raz druga, ale ich wyświetlanie nie jest poprawne np. w danym momencie wyświetlana jest 1/3 jednej tekstury i 2/3 drugiej tekstury albo 1/2 jednej tekstury o 1/2 drugiej tekstury. Nie jest wyświetlana na zmianę raz jedna tekstura raz druga. Wyświetlanie zmienianej tekstury na quadzie jakby się "tnie". Poniższa funkcja jest wywoływana w głównej funkcji rysującej w każdej ramce: void drawNoise( int x ) { glEnable( GL_TEXTURE_2D ); glEnable( GL_DEPTH_TEST ); if( x > prev ) { glBindTexture( GL_TEXTURE_2D, texPosNoise ); prev = x; } else { glBindTexture( GL_TEXTURE_2D, texNegNoise ); } glBegin( GL_QUADS ); glColor3f( 1.0f, 1.0f, 1.0f ); glTexCoord2f( 0.0, 0.0 ); glVertex3f( - 15.0, - 15.0, 0.0 ); glTexCoord2f( 0.0, 1.0 ); glVertex3f( - 15.0, 15.0, 0.0 ); glTexCoord2f( 1.0, 1.0 ); glVertex3f( 15.0, 15.0, 0.0 ); glTexCoord2f( 1.0, 0.0 ); glVertex3f( 15.0, - 15.0, 0.0 ); glEnd(); glDisable( GL_TEXTURE_2D ); glDisable( GL_DEPTH_TEST ); }
Wszelka konstruktywna krytyka i wskazówki co można poprawić w kodzie mile widziane:) |
|
« 1 » 2 |