Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Mär 29, 2024 00:36

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Okt 10, 2013 13:49 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Hallo,

Ich wollte anhand des Tutorials: Wassereffekt eine Wasseroberfläche Rendern, erstmal ohne Shader.

Allerdings habe ich glaube ich ein paar Verständnissprobleme:

-Wann wird RenderWaterMap aufgerufen und muss ich alles am ende nochmal rendern damit es wirklich da ist? Das sind immerhin 3 Renderdurchgänge für 1 Frame.
-Gehören beide Teile des vorgegebenen Codes zur selben Procedure "RenderWaterMap"?
-Wie funktioniert die ClipPlane, ich verwende Y als höhe nicht Z und muss das sicher anpassen, außerdem hat meine Wasserebene die Höhe von Y=200.
-Die Texturtransformation gefällt mir ehrlich gesagt gar nicht, Kann ich die nicht raus lassen und "Normale" Koordinaten nehmen zwischen 0 und 1?

ich höffe ihr könnt mir bisschen helfen ;)

lg Dropye


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 11, 2013 10:57 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 14, 2013 21:17
Beiträge: 587
Programmiersprache: C++
Dropye hat geschrieben:
-Wie funktioniert die ClipPlane, ich verwende Y als höhe nicht Z und muss das sicher anpassen, außerdem hat meine Wasserebene die Höhe von Y=200.

Eine Ebene kann man sich vorstellen wie ein Quad (oder Triangle) mit unendlichen Seitenlängen. Es gibt also keine Eckpunkte, was die Definition auf den ersten Blick schwieriger macht. Man kann die Ebene aber trotzdem vollständig beschreiben und zwar indem man die Koordinaten irgendeines Punktes auf der Ebene angibt und einen Normalenvektor.
Also der Punkt p liegt auf der Ebene und der Normalenvektor n steht senkrecht auf der Ebene. Wenn man sich nun irgendeinen anderen Punkt x auf der Ebene sucht, liegt der Verbindungsvektor x-p ebenfalls in der Ebene - also steht der Verbindungsvektor senkrecht zum Normalenvektor. Mit anderen Worten: Das Punktprodukt ist gleich 0. Als Gleichung ausgedrückt:
Zitat:
dot(x-p, n) = 0
 
Das dot() können wir auspacken:
(x1-p1)*n1 + (x2-p2)*n2 + (x3-p3)*n3 = 0
 
Ausmultiplizieren erbgibt:
(x1*n1 + x2*n2 + x3*n3) - (p1*n1 + p2*n2 + p3*n3) = 0
 
Den zweiten Summanden fassen wir zusammen als Koeffizienten d:
d = -(p1*n1 + p2*n2 + p3*n3) = -dot(p, n)
(x1*n1 + x2*n2 + x3*n3) + d = 0

glClipPlane erwartet die vier Koeffizienten n1, n2, n3 und d, welche die Ebene vollständig beschreiben. Alles, was du machen musst, ist also ein n und ein p finden, dass deine Ebene korrekt beschreibt, sodass du d ausrechnen kannst.
In deinem Fall ist also n = (n1,n2,n3) = (0,1,0)
und p = (p1,p2,p3) = (0,200,0)
d = -dot(p, n) = -200

Ich hoffe, ich konnte dir in diesem Punkt helfen. :)

Edit: Zu Ebenen kann man nun endlich auch in unserem Wiki etwas lesen :)

_________________
So aktivierst du Syntaxhighlighting im Forum: [code=pascal ][/code], [code=cpp ][/code], [code=java ][/code] oder [code=glsl ][/code] (ohne die Leerzeichen)


Zuletzt geändert von glAwesome am Sa Okt 12, 2013 16:49, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 11, 2013 17:38 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Dropye hat geschrieben:
-Wann wird RenderWaterMap aufgerufen und muss ich alles am ende nochmal rendern damit es wirklich da ist? Das sind immerhin 3 Renderdurchgänge für 1 Frame.

RenderWaterMap rufst du vor deinem eigentlichen Rendern auf, wenn du keine FBOs verwendest (was in dem Tutorial auch nicht vorgesehen ist). Es ist wichtig, dass dein Framebuffer leer ist.

Dropye hat geschrieben:
-Gehören beide Teile des vorgegebenen Codes zur selben Procedure "RenderWaterMap"?

Ich bin mir nicht sicher, was du mit „beide Teile“ meinst, da es mehr als zwei Code-Abschnitte gibt. Die Antwort lautet aber in jedem Falle nein. Der erste Teil ist für RenderWaterMap, der zweite Teil ist für die Darstellung der Wasserebene.

Dropye hat geschrieben:
-Wie funktioniert die ClipPlane, ich verwende Y als höhe nicht Z und muss das sicher anpassen, außerdem hat meine Wasserebene die Höhe von Y=200.

Uff. Also an der Koordinate hängt viel. Ich würde jetzt erstmal pauschal keine Garantie geben, dass das Schmerzfrei funktioniert. Da wirst du einiges an den Matrizen anpassen müssen. Eventuell ist es einfacher, den Rest deiner Szene zu verschieben.

Dropye hat geschrieben:
-Die Texturtransformation gefällt mir ehrlich gesagt gar nicht, Kann ich die nicht raus lassen und "Normale" Koordinaten nehmen zwischen 0 und 1?

Die Texturtransformation ist aber der eigentliche Trick. Der Vorteil daran ist, dass die Texturkoordinaten gleich den Weltkoordinaten werden. Du kopierst ja das Screen-Space-Bild in die Textur. Damit das korrekt zurückgerechnet wird, muss man die gleiche Projektionsmatrix, die man auch für die Geometrie verwendet, für die Texturkoordinaten verwenden. Dann greifen die Fragmente des Wasserquads genau auf die Texel zu, die das Fragment im Renderpass für die Watermap aufgenommen haben.

Ich hoffe ich konnte helfen. Ansonsten frag nochmal ;)

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Okt 14, 2013 20:28 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Ich danke euch erstmal für die Erklärungen :)


Ich habe jetzt die Refraction erstmal raus genommen und mach nur die Reflection.
Außerdem habe ich die Szene gedreht sodass nun Z die Höhe ist.

Dann habe ich den Code den neuen Gegebenheiten angepasst.

Allerdings sehe ich gar nichts von der Reflection, ich werde die Renderschritte mal schritt für schritt erläutern.

Zuerst kommt das ganze Standartgedöns:

Code:
  1.  
  2. void renderScene()
  3. {
  4.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  5.  
  6.     glMatrixMode(GL_PROJECTION);
  7.     glLoadIdentity();
  8.     gluPerspective(45.0, gEnv.AppInfo->GetClientWidth() / gEnv.AppInfo->GetClientHeight(), 0.1, 10000);
  9.         gEnv.Camera->Update();
  10.     glMatrixMode(GL_MODELVIEW);
  11.     glLoadIdentity();
  12.  
  13.     gEnv.Terrain->RenderWaterMap();
  14.     gEnv.Terrain->Draw();
  15.  


Jetzt wird es Spezieller:

RenderWaterMap erstellt die texturen und Zeichnet die Wasseroberfläche:

Code:
  1. void CTerrain::RenderWaterMap()
  2. {
  3.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  4.  
  5.     glViewport(0,0,WaterTexSize, WaterTexSize);
  6.  
  7.     glMatrixMode(GL_TEXTURE);
  8.      glLoadIdentity();
  9.     glMatrixMode(GL_MODELVIEW);
  10.  
  11.     DoRenderPass(true);
  12.  
  13.     Reflect->Bind();
  14.      glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, WaterTexSize, WaterTexSize);
  15.     Reflect->UnBind();
  16.  
  17.     if(UseWaterShader)
  18.         glClearColor(0.0, 0.0, 0.0, 0.0);
  19.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  20.  
  21.     glViewport(0,0, gEnv.AppInfo->GetClientWidth(), gEnv.AppInfo->GetClientHeight());
  22.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  23.     glMatrixMode(GL_TEXTURE);
  24.      glLoadIdentity();
  25.      glTranslatef(0.5, 0.5, 0.0);
  26.      glScalef(0.5, 0.5, 0.0);
  27.  
  28.      gluPerspective(45.0, gEnv.AppInfo->GetClientWidth() / gEnv.AppInfo->GetClientHeight(), 0.1, 10000);
  29.      gEnv.Camera->Update();
  30.      gEnv.Camera->Rotate(gEnv.AppInfo->GetMousePos().x, gEnv.AppInfo->GetMousePos().y);
  31.     glMatrixMode(GL_MODELVIEW);
  32.  
  33.     glColor4f(1.0, 1.0, 1.0, 1.0);
  34.     Reflect->Bind();
  35.  
  36.     glDepthMask(GL_FALSE);
  37.     glBegin(GL_QUADS);
  38.     glTexCoord3f (-1024, -1024,  0);
  39.     glVertex3f   (-1024, -1024, 200);
  40.     glTexCoord3f (-1024, 1024, 0);
  41.     glVertex3f   (-1024, 1024,  200);
  42.     glTexCoord3f ( 1024, 1024, 0);
  43.     glVertex3f   ( 1024, 1024,  200);
  44.     glTexCoord3f ( 1024, -1024, 0);
  45.     glVertex3f   ( 1024, -1024, 200);
  46.     glEnd();
  47.     glDepthMask(GL_TRUE);
  48.  
  49.  
  50.     glMatrixMode(GL_TEXTURE);
  51.      glLoadIdentity();
  52.     glMatrixMode(GL_MODELVIEW);
  53.      glLoadIdentity();
  54. }


Danach wird das Terrain nochmal gerendert.

Ich nutze zur Zeit kein GL_CULL_FACE da erst das Terrain umgestellt werden muss wegen der Drehung.

Ich kann leider selber nicht ausmachen wo hier der Fehler ist das ich rein gar nichts von dem Quad sehe.
Jemand von euch eine Ahnung?

lg Dropye


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Di Okt 15, 2013 07:52 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich nehme an, GL_TEXTURE_2D ist schon aktiviert. Deaktivier das mal, damit das Quad weiß wird und du siehst, ob du wirklich an die stelle zeichnest, an der du es erwartest.

Das Problem wird denke ich sein, dass du immer noch deine Wasserebene nicht bei 0 hast. Das war das, was ich eigentlich meinte; Von Z auf Y bzw. umgekehrt umzustellen, sollte kein Problem sein, aber die Verschiebung bedeutet einigen Aufwand.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mi Okt 16, 2013 15:25 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Okay ich habe jetzt noch ein bisschen gebastelt und ich glaube wir kommen der Sache näher.

Ich erstelle nun zuerst die Textur, Rendere dann das Terrain noch einmal und zeichne am Ende die Wasserebene hinein.
Außerdem habe ich alles um 200 nach unten verschoben sodass die Wasserebene nun wirklich bei 0 ist.
Nun sieht es aber so aus das nicht alles was über dem Wasser ist in der Textur landet sondern alles was unter dem Wasser ist. (Siehe Bild im Anhang).
Ich habe darauf mal umrandet wo das Land aufhört und Wasser beginnt.
Einfach das InvertZ umdrehen geht nicht dann sehe ich gar nichts mehr auf der Textur.

Hier nochmal die Aktuelle Version des Codes:

Code:
  1.  
  2. int RenderSzene[...]
  3.     gEnv.Terrain->CreateWaterMap();
  4.     gEnv.Terrain->Draw();
  5.     gEnv.Terrain->RenderWaterMap();
  6. [...]
  7. }


Code:
  1.  
  2. void CTerrain::RenderWaterMap()
  3. {
  4.     glMatrixMode(GL_TEXTURE);
  5.      glLoadIdentity();
  6.      glTranslatef(0.5, 0.5, 0.0);
  7.      glScalef(0.5, 0.5, 0.0);
  8.  
  9.      gluPerspective(45.0, gEnv.AppInfo->GetClientWidth() / gEnv.AppInfo->GetClientHeight(), 0.1, 10000);
  10.      gEnv.Camera->Update();
  11.      gEnv.Camera->Rotate(gEnv.AppInfo->GetMousePos().x, gEnv.AppInfo->GetMousePos().y);
  12.     glMatrixMode(GL_MODELVIEW);
  13.  
  14.     glPushMatrix();
  15.     glColor4f(1.0, 1.0, 1.0, 1.0);
  16.     Reflect->Bind();
  17.     //glBindTexture(GL_TEXTURE_2D, 0);
  18.     glDepthMask(GL_FALSE);
  19.     glBegin(GL_QUADS);
  20.     glTexCoord3f (-1024, -1024, 0); glVertex3f (-1024, -1024, 0);
  21.     glTexCoord3f (-1024,  1024, 0); glVertex3f (-1024,  1024, 0);
  22.     glTexCoord3f ( 1024,  1024, 0); glVertex3f ( 1024,  1024, 0);
  23.     glTexCoord3f ( 1024, -1024, 0); glVertex3f ( 1024, -1024, 0);
  24.     glEnd();
  25.     glDepthMask(GL_TRUE);
  26.     glPopMatrix();
  27.  
  28.  
  29.     glMatrixMode(GL_TEXTURE);
  30.      glLoadIdentity();
  31.     glMatrixMode(GL_MODELVIEW);
  32.      glLoadIdentity();
  33. }
  34.  
  35. void CTerrain::CreateWaterMap()
  36. {
  37.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  38.  
  39.     glViewport(0,0,WaterTexSize, WaterTexSize);
  40.  
  41.     glMatrixMode(GL_TEXTURE);
  42.      glLoadIdentity();
  43.     glMatrixMode(GL_MODELVIEW);
  44.  
  45.     DoRenderPass(true);
  46.  
  47.     Reflect->Bind();
  48.      glCopyTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 0, 0, WaterTexSize, WaterTexSize);
  49.     Reflect->UnBind();
  50.  
  51.     if(UseWaterShader)
  52.         glClearColor(0.0, 0.0, 0.0, 0.0);
  53.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  54.  
  55.     glViewport(0,0, gEnv.AppInfo->GetClientWidth(), gEnv.AppInfo->GetClientHeight());
  56.     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  57.  
  58.     glLoadIdentity();
  59. }
  60.  


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Fr Okt 18, 2013 15:14 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
Die Shaderfreie Variante ist gemeistert :)

hier noch ein Bild für euch :)

Nun geht es an die Shader Variante, da habe ich schon ein bissen rum gespielt und werde mich sicherlich nochmal melden :D

Dateianhang:
Bild.jpg


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: So Okt 20, 2013 00:16 
Offline
DGL Member

Registriert: Do Jan 07, 2010 21:58
Beiträge: 240
So jetzt bin ich bei den Shadern angekommen und hab auch hier wieder ein paar Fragen.

Zum beispiel erschließt sich mir nicht was der 2. satz Texturkoordinaten sein soll und wie ich den übergebe?

Nach viel nachdenken und lesen sieht mein code bisher so aus:


Shader erstellen und das übergeben was nicht immer wiederholt werden muss
Code:
  1.  
  2.     WaterShader = new CShader("Data/Shader/Wasser");
  3.  
  4.     WaterShader->RegisterVariable("refractTex");
  5.     WaterShader->RegisterVariable("reflectTex");
  6.     WaterShader->RegisterVariable("bumpMap");
  7.     WaterShader->RegisterVariable("refractRatio");
  8.     WaterShader->RegisterVariable("reflectRatio");
  9.     WaterShader->RegisterVariable("mappingRatio");
  10.     WaterShader->RegisterVariable("extendedBlending");
  11.    
  12.     WaterShader->Use(true);
  13.     WaterShader->SetVariable1f("refractRatio", 1/20.0f);
  14.     WaterShader->SetVariable1f("reflectRatio", 1/20.0f);
  15.     WaterShader->SetVariable1i("extendedBlending", 0);
  16.     WaterShader->SetVariable1f("mappingRatio", 0.5);
  17.     WaterShader->Use(false);


Dann kommt ganz normal CreateWaterMap wo die Texturen befüllt werden.

Und dann noch das übergeben der Textureinheiten und rendern.

Code:
  1.     WaterShader->Use(true);
  2.  
  3.     glActiveTexture(GL_TEXTURE0);
  4.     Refract->Bind();
  5.     glActiveTexture(GL_TEXTURE1);
  6.     Reflect->Bind();
  7.     glActiveTexture(GL_TEXTURE2);
  8.     Bumb->Bind();
  9.  
  10.     WaterShader->SetVariable1i("reflectTex", 0);
  11.     WaterShader->SetVariable1i("refractTex", 1);
  12.     WaterShader->SetVariable1i("bumpMap", 2);
  13.  
  14.     glMatrixMode(GL_TEXTURE);
  15.      glActiveTexture(GL_TEXTURE0);
  16.      glLoadIdentity();
  17.      glTranslatef(0.5, 0.5, 0.0);
  18.      glScalef(0.5, 0.5, 0.0);
  19.  
  20.      gluPerspective(45.0, gEnv.AppInfo->GetClientWidth() / gEnv.AppInfo->GetClientHeight(), 0.1, 10000);
  21.      gEnv.Camera->Update();
  22.      gEnv.Camera->Rotate(gEnv.AppInfo->GetMousePos().x, gEnv.AppInfo->GetMousePos().y);
  23.    
  24.     glMatrixMode(GL_MODELVIEW);
  25.    
  26.     glPushMatrix();
  27.     glBegin(GL_QUADS);
  28.     glTexCoord3f (-1024, 0, -1024); glVertex3f (-1024, 0, -1024);
  29.     glTexCoord3f (-1024, 0,  1024); glVertex3f (-1024, 0,  1024);
  30.     glTexCoord3f ( 1024, 0,  1024); glVertex3f ( 1024, 0,  1024);
  31.     glTexCoord3f ( 1024, 0, -1024); glVertex3f ( 1024, 0, -1024);
  32.     glEnd();
  33.     glPopMatrix();
  34.  
  35.     WaterShader->Use(false);
  36.  
  37.     glMatrixMode(GL_TEXTURE);
  38.      glLoadIdentity();
  39.     glMatrixMode(GL_MODELVIEW);
  40.      glLoadIdentity();


Problem ist das ich wieder mal gar nichts vom wasser sehe, alles andere ist da wo es sein soll.

Habt ihr noch paar tips für mich?

lg


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 8 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 56 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.213s | 17 Queries | GZIP : On ]