[OpenGL] TV noise - animacja
Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Zarejestruj się!

[OpenGL] TV noise - animacja

AutorWiadomość
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
P-164641
» 2017-09-06 19:14:58
Podejrzewam że najszybciej będzie na zmianę wyświetlać twoją teksturę i jej negatyw.
P-164642
» 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
P-164643
» 2017-09-30 11:41:09
Ja coś podobnego zrobiłem w SFML. Kod:
C/C++
#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
P-165357
» 2017-10-02 16:00:01
Nie polecam powyższego. Boli mnie ta wydajność.
P-165405
» 2017-10-02 17:42:07
Boli mnie ta wydajność.
Tylko? Ten kod jest też błędny.
P-165410
» 2017-10-02 20:25:58
W sumie racja. Tylko pobieżnie się przyjrzałem.
P-165413
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:

C/C++
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:)
P-165730
« 1 »
 Strona 1 z 1