Autor Wątek: [OpenGL] Przejście pomiędzye efektami - błąd  (Przeczytany 544 razy)

Offline slowbro

  • Użytkownik

# Październik 08, 2017, 02:06:40
Cześć

Wyłącze jeden z wątków z jednego z moich postów do całkiem nowego wątku, ponieważ gdzieś zapodział się. Eksperymentuje obecnie z synchronizacją prostych efektów z muzyką. Muzyka jest napisana w postaci modułu trackerowego. API playera muzyki zwraca wiersz patternu, co można wykorzystać do synchronizacji. W patternie jest 64 wiersze (numerowane od 0 do 63). Przejście pomiędzy jednym efektem a drugim ma odbyć się w postaci białego błysku. Kod rysujący figury w zależności od tego jaki wiersz modułu muzycznego jest grany przedstawia się następująco:

if ((rowNumber >= 0) && (rowNumber <=127))
{               
        drawFigure1(); 
}

if (rowNumber == 128)
        whiteFlash();                                                           

if ((rowNumber >= 129) && (rowNumber <=256))
{
        drawFigure2();                         
}

Gdy odgrywany jest 128 wiersz ma być biały błysk pomiędzy jednym efektem a drugim, a niestety tego białego błysku nie ma. Kod dotyczący białego błysku działa na 100% poprawnie, ponieważ jak się wywoła biały błysk w czasie trwania jakiegoś efektu to jest ładnie widoczny. Co może być przyczyną tego, że biały błysk nie jest widoczny pomiędzy jednym a drugim efektem? Oto poniżej kod odpowiedzialny za biały błysk:

void whiteFlash()
{
        glLoadIdentity();                                                                       
        glTranslatef (0.0f, 0.0f, -5.0f);

        glPolygonMode(GL_FRONT, GL_FILL);
        glPolygonMode(GL_BACK, GL_FILL);
       
        glDisable(GL_TEXTURE_2D);
        glEnable(GL_BLEND);
        glBlendFunc (GL_SRC_ALPHA, GL_ONE);     
       
        if (alpha <= 1)
        {
                glColor4f(1.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();

                alpha += 0.025;
        }
        else
        {
                glColor4f(1.0, 1.0, 1.0, alpha_inv);

                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();

                alpha_inv -= 0.025;
        }

        glDisable(GL_BLEND);
        glEnable(GL_TEXTURE_2D);       
       
        return;
}

Pozdrawiam

Offline Mr. Spam

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

Offline lukasz1m

  • Użytkownik

# Październik 08, 2017, 08:47:41
a gdzie masz kod w którym zmienna rowNumber  jest wyznaczana?
Problem nie leży w funkcji whiteFlash tylko gdzieś gdzie ustawiana jest ta zmienna "rowNumber". bo prawdopodobnie nigdzie nie jest nadawana wartosc 128.
« Ostatnia zmiana: Październik 08, 2017, 08:50:05 wysłana przez lukasz1m »

Offline slowbro

  • Użytkownik

# Październik 08, 2017, 11:12:24
Wartość dla zmiennej  rowNumber jest przypisywana na samym początku funkcji Draw() i działa poprawnie, ponieważ jak wstawię wywołanie whiteFlash() wewnątrz warunku rysującego figurę to błysk pojawia się tak jak ma pojawiać w rytm uderzeń perkusji:

if ((rowNumber >= 0) && (rowNumber <=127))
{             
        drawFigure1(); 

if (rowNumber % 8 == 0)
{
whiteFlash(); 
}
}

czy tu:

if ((rowNumber >= 129) && (rowNumber <=256))
{
        drawFigure2();

if (rowNumber % 8 == 0)
{
whiteFlash(); 
}
}

Offline lukasz1m

  • Użytkownik

# Październik 08, 2017, 11:56:41
To skoro zmienna rowNumber jest wszędzie aktualizowana poprawnie to możezanim wejdzie w to miejsce
if (rowNumber == 128)
        whiteFlash();
to rowNumber  już zmieni swoją wartość?
jedyne co to musiałbys pokazać kod gdzie aktualizujesz rowNumber...
« Ostatnia zmiana: Październik 08, 2017, 11:59:19 wysłana przez lukasz1m »

Offline slowbro

  • Użytkownik

# Październik 08, 2017, 22:33:13
Proszę bardzo:

int DrawGLScene(GLvoid)
{
int rowNumber = Music_GetPosition();

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
        ...
        tu jest dalsza część kodu





Offline lukasz1m

  • Użytkownik

# Październik 08, 2017, 23:16:56
No jak to to w takim razie co zwraca ta funkcje Music_GetPosition()?? z dokumentacji ?
załóż breakpointa najlepiej i sprawdz czy w ogóle kiedykolwiek ta funkcja zwraca 128?
« Ostatnia zmiana: Październik 08, 2017, 23:21:02 wysłana przez lukasz1m »

Offline slowbro

  • Użytkownik

# Październik 08, 2017, 23:28:02
Dzięki, sprawdzę oczywiście debuggerem:)
« Ostatnia zmiana: Październik 08, 2017, 23:29:59 wysłana przez slowbro »

Offline Karol

  • Użytkownik

# Październik 09, 2017, 09:25:33
Wyłącze jeden z wątków z jednego z moich postów do całkiem nowego wątku, ponieważ gdzieś zapodział się.
Nigdzie się nie zapodział http://forum.warsztat.gd/index.php/topic,31292.msg347835.html#msg347835