Autor Wątek: Silnik pisany w opengl problem z wodą  (Przeczytany 1965 razy)

Offline prociomen007

  • Użytkownik

# Październik 27, 2009, 12:42:24
Witam, od pewnego czasu w C++ piszę silnik graficzny oparty na opengl i direct. Jego zadaniem jest próba jak najwierniejszego oddania rzeczywistości - oczywiście na tyle na ile jestem w stanie. Niestety ostatnio utknąłem podczas tworzenia wody. Woda według moich założeń powinna:
-falować
-błyszczeć w słońcu
-odbijać otoczenie
CO MAM:
-woda faluje
-odbija otoczenie
CZEGO NIE MAM:
- woda co prawda odbija otoczenie ale robi to za regularnie odbicie powinno być pomarszczone rozmyte.
- Silnik generuje teren następnie taflę wody jako że w wodzie widoczne ma być odpicie powierzchnię wody tworzę półprzeźroczystą co powoduje nakładanie się odbicia na powierzchnię terenu pod wodą. Chciałbym aby terenu pod powierzchnią wody nie było widać wogule tylko jego odbicie.

Offline Mr. Spam

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

Offline Esidar

  • Użytkownik

# Październik 27, 2009, 12:53:32
Tak trzymać. Jak dopiszesz to czego nie masz to już będzie niezła woda.

Offline prociomen007

  • Użytkownik

# Październik 27, 2009, 13:06:58
he tylko że ja po to napisałem to czego nie mam aby wysłuchać waszych propozycji i sugestii jak rozwiązać moje problemy

Offline Kuba D.

  • Użytkownik

# Październik 27, 2009, 13:07:27
A jak masz zrobione falowanie wody ? Sama animacja wierzchołków czy jeszcze do tego masz animowaną normal mapę ?

Zresztą popatrz tutaj jak się powinno robić wodę ;)

Offline Avaj

  • Użytkownik

# Październik 27, 2009, 17:35:56
http://www.riemers.net/eng/Tutorials/XNA/Csharp/Series4/The_water_technique.php

tu masz taką wodę jaką chcesz, wprawdzie XNA + C#, ale techniki dokładnie te same

Offline prociomen007

  • Użytkownik

# Październik 28, 2009, 23:22:11
Dziękuje wszystkim. Korzystając z waszych tutkow', w końcu udało osiągnąć mi się zadowalający efekt. Niestety pojawił sie kolejny problem którego nie mogę rozwiązać. Kiedy uruchamiam funkcje renderująca wodę znikają wszystkie tektury na innych obiektach, tzn. sa przez 1sekunde i znikają. Funkcja renderująca wodę ma postać:

void RenderWater()
{
   glUseProgramObjectARB(my_program);
   
   int uniform = glGetUniformLocationARB(my_program, "viewpos");
   glUniform4fARB(uniform, ViewPos.x, ViewPos.y, ViewPos.z, 1.0);

   uniform = glGetUniformLocationARB(my_program, "lightpos");
   glUniform4fARB(uniform, 5.0f,25.0f,6.0f, 1.0f);

   uniform = glGetUniformLocationARB(my_program, "time");
   glUniform1fARB(uniform, texmove);

   uniform = glGetUniformLocationARB(my_program, "time2");
   glUniform1fARB(uniform, -texmove);

   texmove += 0.01;
   
   uniform = glGetUniformLocationARB(my_program, "water_reflection");
   glUniform1iARB(uniform, 0);

   uniform = glGetUniformLocationARB(my_program, "water_refraction");
   glUniform1iARB(uniform, 1);
   
   uniform = glGetUniformLocationARB(my_program, "water_normalmap");
   glUniform1iARB(uniform, 2);   

   uniform = glGetUniformLocationARB(my_program, "water_dudvmap");
   glUniform1iARB(uniform, 3);

   uniform = glGetUniformLocationARB(my_program, "water_depthmap");
   glUniform1iARB(uniform, 4);

   uniform = glGetUniformLocationARB(my_program, "waterColor");
   glUniform4fARB(uniform, 1.0f,1.0f,1.0f, 1.0f);

   uniform = glGetUniformLocationARB(my_program, "waterDepth");
   glUniform4fARB(uniform, 1.0f,1.0f,1.0f, 1.0f);

    glActiveTextureARB(GL_TEXTURE0_ARB);
    glEnable(GL_TEXTURE_2D);
   glBindTexture(GL_TEXTURE_2D, reflectionTexture);

    glActiveTextureARB(GL_TEXTURE1_ARB);
   glEnable(GL_TEXTURE_2D);
   glBindTexture(GL_TEXTURE_2D, refractionTexture);

    glActiveTextureARB(GL_TEXTURE2_ARB);
   glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, normalmap.TextureID);

    glActiveTextureARB(GL_TEXTURE3_ARB);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, dudvmap.TextureID);

    glActiveTextureARB(GL_TEXTURE4_ARB);
   glEnable(GL_TEXTURE_2D);
   glBindTexture(GL_TEXTURE_2D, depthTexture);

    glBegin(GL_QUADS);
      glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 5.0f);
      glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0.0f, 1.0f);
      glVertex3f(-5.0f, 0.0f, 5.0f);

      glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 0.0f, 0.0f);
      glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0.0f, 1.0f);
      glVertex3f(-5.0f, 0.0f, -5.0f);

      glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 5.0f, 0.0f);
      glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0.0f, 1.0f);
      glVertex3f(5.0f, 0.0f, -5.0f);

      glMultiTexCoord2fARB(GL_TEXTURE0_ARB, 5.0f, 5.0f);
      glMultiTexCoord2fARB(GL_TEXTURE1_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE2_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE3_ARB, 0.0f, 1.0f);
      glMultiTexCoord2fARB(GL_TEXTURE4_ARB, 0.0f, 1.0f);
      glVertex3f(5.0f, 0.0f, 5.0f);
    glEnd();

   glActiveTextureARB(GL_TEXTURE0_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE2_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE3_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE4_ARB); glDisable(GL_TEXTURE_2D);
   glUseProgramObjectARB(0);


}

Natomiast funkcja renderująca obiekt wygląda tak:

void drawSomeThings()
{   
   glPushMatrix();
      glTranslatef(-0.5f,0.25f,0.0f);                  
      glScalef(0.25f,0.25f,0.25f);
      glRotatef(rtri,0.0f,1.0f,0.0f);               

   glBindTexture(GL_TEXTURE_2D, texture[0]);

   glBegin(GL_QUADS);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
      glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
      glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
      glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
      glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
      glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
      glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
      glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
      glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
      glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);
      glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);
      glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);
      glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);
      glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);
      glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);
      glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);
      glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);
   glEnd();               
   glPopMatrix();
   
   //rtri+=0.2f;                              
   //rquad-=0.15f;                              
}


Jeśli wiecie gdzie jest błąd to bardzo prosił bym o odpowiedz.

Offline _OskaR

  • Użytkownik

# Październik 28, 2009, 23:30:39
Jak chcesz fajną wodę, to dorzuć Efekt Fresnela, piankę, kaustyki, miękkie brzegi i falowanie na VS (w ShaderX6 opisali niektóre rzeczy).

Offline Avaj

  • Użytkownik

# Październik 28, 2009, 23:33:00
Spróbuj zamienić:

   glActiveTextureARB(GL_TEXTURE0_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE2_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE3_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE4_ARB); glDisable(GL_TEXTURE_2D);

na

   glActiveTextureARB(GL_TEXTURE1_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE2_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE3_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE4_ARB); glDisable(GL_TEXTURE_2D);
   glActiveTextureARB(GL_TEXTURE0_ARB); glEnable(GL_TEXTURE_2D);

Offline prociomen007

  • Użytkownik

# Październik 29, 2009, 16:21:00
Dzięki ,,Java,, twoja rada pomogła.