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

Aktuelle Zeit: So Apr 28, 2024 19:39

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Sa Jul 21, 2012 15:09 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Hallo,

ich beschäftige mich seit einer Weile mit OpenGL (Linux / C++) und hänge momentan am Wassereffekt Tutorial.
(hier: http://wiki.delphigl.com/index.php/Tutorial_Wassereffekt)
erstmal nur reflections, keine shader, keine refractions

Ich hänge seit mehreren Stunden an den Reflektionen und komme irgendwie nicht weiter. Ich sehe auf
meiner Wasseroberfläche zwar eine Textur, jedoch bewegt diese sich bei drehender Kamera nicht
so wie sie eigentlich sollte. Leider sinds so viele Schritte, dass ich nicht eingrenzen kann wo es liegt.
Kann ich irgendwie Zwischenresultate (wie die erstellte Textur) ausgeben, um zu sehen ob es hier schon Probleme gibt?

Ich habe ein paar Verständnisprobleme beim Tutorial, vielleicht lässt es sich ja danach schon lösen:
was genau findet in "RenderGameScene" statt? Nur Meshes rendern? oder auch Kamera Positionierung?
was machen "DoCamTranslate" bzw. "DoCamRotate"? Ich verwende "gluLookAt", ist das damit gemeint?
an welcher Stelle wird die eigentliche Szene gerendert, die dann auch ausgegeben wird?
(der Gesamtaufbau wird mir aus dem Beispielcode irgendwie nicht ganz klar)

Vielen Dank im Voraus! :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Sa Jul 21, 2012 16:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
DoCamRotate und DoCamTranslate kümmern sich um die Kamerapositionierung, während RenderGameScene wirklich nur rendert. Wenn dir das nicht hilft, versuch mal die Textur auf ein im Ortho-Modus gezeichnetes Quad über die Szene zu zeichnen und schau was rauskommt.

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  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Sa Jul 21, 2012 19:25 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Ich hab es jetzt hinbekommen, nachdem ich im "DoRenderPass" nach "glLoadIdentity" noch
ein kamera-update mittels "gluLookAt" eingebaut habe. fehlt das im tutorial vielleicht?

Jetzt wollte ich mich mit den Shadern beschäftigen.. Jedoch sind im Tutorial 2 (oder noch mehr?)
verschiedene Versionen enthalten, von denen aber auch nur die letzte im Code angesteuert wird.
Ich kenne mich mich Shadern noch garnicht aus, aber auch hier scheint was zu fehlen oder?
Müssen diese "uniform Sample2D" nicht dem Shader übergeben werden? Ich sehen jedenfalls
keine Veränderung durch da Shader.. Jedoch weiß nach lesen des Tutorials auch nicht wirklich
an welchen Code-Stellen diese eingebaut werden müssen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: So Jul 22, 2012 15:43 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
ich bin mittlerweile einen Schritt weiter und habe jetzt schonmal den folgenden Code für die
Ansteuerung des Shaders:

Code:
  1. shaderWater->add(GL_VERTEX_SHADER, "shader/water.vert");
  2. shaderWater->add(GL_FRAGMENT_SHADER, "shader/water.frag");
  3. shaderWater->link();
  4. shaderWater->setUniform("refractTex", (int) scene->getRefractTexture()->getID());
  5. shaderWater->setUniform("reflectTex", (int) scene->getReflectTexture()->getID());
  6. shaderWater->setUniform("bumpMap", (int) texBump->getID());
  7. shaderWater->setUniform("reflectRatio", 1/20.0f);
  8. shaderWater->setUniform("refractRatio", 1/20.0f);
  9. shaderWater->setUniform("mappingRatio", 0.5f);
  10. shaderWater->setUniform("extendedBlending", 1);


Mir is jedoch nach wie vor unklar, was ich mit diesem Shader jetzt genau anfange.
Wenn ich ihn einfach auf ein QUAD anwende, wird das schwarz.

Auch ist mir noch nicht ganz klar an welcher Stelle der TextureMatrix Code gehört:
Code:
  1.  
  2. glMatrixMode(GL_TEXTURE);
  3. glLoadIdentity;
  4. glTranslatef(0.5, 0.5, 0);
  5. ...usw...
  6.  


Brauche ich mehr als ein QUAD? oder übernimmt der Shader das alles?
Muss ich dem QUAD eine textur zuweisen? Vermutlich eher nicht oder?

Mir würde also schon eine Reihenfolge für die Befehle genügen, ich denke
den rest kann ich dann selbst ausklamüsern. Ich könnte dann auch zum Tutorial
beitragen, da ich denke dass andere bestimmt schon ähnliche Fragen dazu hatten.

Vielen Dank im Voraus


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: So Jul 22, 2012 15:47 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ah da ist schon nen Bug. Irgendwie immer wieder das selbe missverständnis:

die Uniforms für die Sampler sind nicht die Textur-IDs sondern die Nummer der Texturunit an die die Textur gebunden ist! Du musst also deine Texturen an jeweils eine Texturunit binden und dann die indizies der Units übergeben:
Code:
  1.  
  2. shaderWater->setUniform("refractTex", 0);
  3. shaderWater->setUniform("reflectTex", 1);
  4. shaderWater->setUniform("bumpMap", 2);
  5. glActiveTexture(GL_TEXTURE0);
  6. // binde Refraktionstextur
  7. glActiveTexture(GL_TEXTURE1);
  8. // binde Reflektions
  9. glActiveTexture(GL_TEXTURE2);
  10. // binde bumpmap


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  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: So Jul 22, 2012 16:41 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Das hat mich schonmal weitergebracht. Leider schmiert das Programm momentan sofort ab.
Ich denke sowas wie in überlauf im Shader?

Mein Code zum Rendern der Wasseroberfläche ist wie folgt:

Code:
  1.  
  2.  
  3. // wasser shader aktivieren
  4. glUseProgram(...)
  5.  
  6. // texturen binden
  7. glActiveTexture(GL_TEXTURE0);
  8. if (texRefract != NULL) {texRefract->apply();}
  9. glActiveTexture(GL_TEXTURE1);
  10. if (texReflect != NULL) {texReflect->apply();}
  11. glActiveTexture(GL_TEXTURE2);
  12. if (texBump != NULL) {texBump->apply();}
  13.  
  14. // textur-matrix transformieren
  15. glMatrixMode(GL_TEXTURE);
  16. glActiveTexture(GL_TEXTURE0);
  17. glLoadIdentity();
  18. glTranslatef(0.5, 0.5, 0);
  19. glScalef(0.5, 0.5, 0);
  20. float ratio = 4.0/3.0;
  21. gluPerspective(45.0, ratio, 0.01, 5000.0);
  22. cam->update(); // mein gluLookAt(...)
  23.  
  24. // zurueck zum modelview
  25. glMatrixMode(GL_MODELVIEW);
  26.  
  27. // zeichnen des QUADs
  28. glBegin(GL_QUADS);
  29. ...
  30. glEnd();
  31.  
  32. // programm entladen
  33. glUseProgram(0);
  34.  


irgendwo hier ist wohl noch der wurm drin :/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Mo Jul 23, 2012 18:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Sieht soweit gut aus. Mit Shadern hab ich allerdings noch kein Programm zum Absturz bekommen. Was passiert genau? (Segfault aka. Access Violation?)

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  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Mi Jul 25, 2012 11:01 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Hatte in der Tat einen kleinen Typo der zu nem NULL Pointer geführt hat. Jetzt gibts nur noch Probleme mit der verzerrung durch die BumpMap, aber das krieg ich schon noch raus ;)

Vielen vielen Dank erstmal!

Eine kurze Frage habe ich noch.

Habe mir fürs Terrain unter/neben dem Wasser einen Shader gebaut. Jetzt geht das ClipPlane nicht mehr. Wenn ich das im Internet richtig verstanden habe, ist das normal und der Shader müsste das ClipPlane selbst implementieren, was aber wohl alles andere als trivial ist bzw. nicht auf allen GPUs läuft? Oder gibts da doch was einfaches?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Mi Jul 25, 2012 17:30 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
kazu hat geschrieben:
Eine kurze Frage habe ich noch.

Habe mir fürs Terrain unter/neben dem Wasser einen Shader gebaut. Jetzt geht das ClipPlane nicht mehr. Wenn ich das im Internet richtig verstanden habe, ist das normal und der Shader müsste das ClipPlane selbst implementieren, was aber wohl alles andere als trivial ist bzw. nicht auf allen GPUs läuft? Oder gibts da doch was einfaches?


Einfach gl_ClipVertex im VertexShader setzen (am einfachsten z.B. via ftransform) und das sollte es schon gewesen sein. Klappt hier wunderbar und ist ganz simpel.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Fr Jul 27, 2012 10:26 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Das klappt allerdings wunderbar ;)
Vielen Dank!

Jedoch gibt es ein kleines "aber".
Ich will die Texturen des Terrains ja noch beleuchten.
Sobald ich "vertex_to_light_vector" ins Spiel bringe und die gl_FragColor mit der
errechneten DiffuseColor multiplizieren (oder addiere.. scheint total egal), findet
der Shader die ganzen uniforms für Texturen und co nicht mehr...

Kommentiere ich dann im VertexShader die"gl_ClipVertex" Zeile aus, geht es ...
Muss ich da irgendwas beachten im Umgang mit gl_ClipVertex und Beleuchtung mittels Normals?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Fr Jul 27, 2012 10:58 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Das klingt für mich nach irgendeinem Syntaxfehler und nicht abgefragten Compilerfehler vom Shader. Siehe auch.

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  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Fr Jul 27, 2012 11:32 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Leider nicht. Compile ist ok. Lediglich 3 Warnings impliziter Casts bei der Erfragung der aktuellen "Texturfarbe".
Konkretes Problem ist, dass die uniform-Location -1 ist, sobald ich die DiffuseValue irgendwie in gl_FragColor einbringe...

Konkret:
Nehme ich die DiffuseValue raus -> gehts.
Nehme ich gl_ClipVertex raus und lasse DiffuseValue drin -> geht auch
Beides gleichzeitig -> geht nicht. (Kein Uniform mehr "auffindbar")

Das hat doch sicher irgendwas mit Optimierung der compilten Shader zu tun oder?
Nach dem Motto "die Texturen haben eh keinen Einfluss mehr aufs Ergebnis der gl_FragColor bei dem was du machst"
Ich verstehe nur nicht warum.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Fr Jul 27, 2012 11:40 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Äh ja, das kann sein. Wenn die Textur für keine Ausgabe verwendet wird, wird der Uniform aus dem Ergebnis entfernt.

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  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Fr Jul 27, 2012 11:45 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
Sie wird aber ja verwendet...
Sobald ich gl_ClipVertex aus dem Vertex shader entferne, läuft alles.
Mit Textur und korrektem Lighting. Nur halt ohne Clipping...

Oder ich mache im FragmentShader aus
gl_FragColor = texColor * DiffuseValue;
ein
gl_FragColor = texColor;

dann gehts auch mit Clipping..

Das Clipping + Lighting scheint sich irgendwie nicht zu vertragen...

Ich hänge am besten mal die Shader an:

Vertex Shader
Code:
  1.  
  2. // needed for lighting
  3. varying vec3 normal;
  4. varying vec3 vertex_to_light_vector;
  5.  
  6. // needed texture matrixes
  7. varying mat4 tex1Matrix;
  8. varying mat4 tex2Matrix;
  9. varying mat4 texMMatrix;
  10.  
  11. void main(void) {
  12.  
  13.     gl_Position         = gl_ModelViewProjectionMatrix * gl_Vertex;
  14.     gl_TexCoord[0]      = gl_MultiTexCoord0;
  15.    
  16.     tex1Matrix = gl_TextureMatrix[1];
  17.     tex2Matrix = gl_TextureMatrix[2];
  18.     texMMatrix = gl_TextureMatrix[3];
  19.    
  20.     normal = gl_NormalMatrix * gl_Normal;
  21.     vertex_to_light_vector = vec3(gl_LightSource[0].position - (gl_ModelViewMatrix * gl_Vertex));
  22.    
  23.     // allow clipping planes.. very important for reflections!
  24.     gl_ClipVertex = gl_ModelViewMatrix * gl_Vertex;
  25.    
  26. }
  27.  


Fragment Shader
Code:
  1.  
  2. // needed textures
  3. uniform sampler2D tex1;
  4. uniform sampler2D tex2;
  5. uniform sampler2D texMix;
  6.  
  7. // blending settings
  8. uniform float min;
  9. uniform float max;
  10.  
  11. // needed texture matrixes
  12. varying mat4 tex1Matrix;
  13. varying mat4 tex2Matrix;
  14. varying mat4 texMMatrix;
  15.  
  16. // needed for lighting
  17. varying vec3 normal;
  18. varying vec3 vertex_to_light_vector;
  19.  
  20. void main(void) {
  21.  
  22.     // color of texture one at the current position
  23.     vec4 c1 = texture2D(tex1, gl_TexCoord[0] * tex1Matrix);
  24.    
  25.     // color of texture two at the current position
  26.     vec4 c2 = texture2D(tex2, gl_TexCoord[0] * tex2Matrix);
  27.    
  28.     // color of the mixing-texture at the current position
  29.     vec4 cMix = texture2D(texMix, gl_TexCoord[0] * texMMatrix);
  30.    
  31.     // get blending percentage from mixing-texture
  32.     float percent = (cMix.r + cMix.g + cMix.b) / 3.0;
  33.    
  34.     // blending calculation:
  35.     // tex1     = 0 -> min
  36.     // tex1/2   = min -> max
  37.     // tex2     = max -> 1
  38.     if      (percent < min) {percent = 0.0;}
  39.     else if (percent > max) {percent = 1.0;}
  40.     else                    {percent = (percent - min) / (max-min);}
  41.    
  42.     // calculate the final display color (for RGB but in one line of code)
  43.     vec4 texColor = (c1 * percent) + (c2 * (1.0 - percent));
  44.    
  45.     // lighting
  46.     vec3 normalized_normal = normalize(normal);
  47.     vec3 normalized_vertex_to_light_vector = normalize(vertex_to_light_vector);
  48.    
  49.     //vec4 diffuseColor = vec4(1.0, 0.0, 0.0, 1.0);
  50.     float DT = clamp(dot(normalized_normal, normalized_vertex_to_light_vector), 0.0, 1.0);
  51.  
  52.     // geht nicht:
  53.     gl_FragColor = texColor * DT;
  54.  
  55.     // geht:
  56.     //gl_FragColor = texColor;
  57.    
  58. }
  59.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Tutorial Wassereffekt - Fragen
BeitragVerfasst: Fr Jul 27, 2012 12:32 
Offline
DGL Member

Registriert: Sa Jul 21, 2012 14:46
Beiträge: 9
Programmiersprache: C++
ich fürchte ich weiß es...
die 3 Matrizen + Clipping sind dann wohl schon am Limit der Parameter die man übertragen kann..
Sobald ich eine der 3 Matrizen entferne, geht es :/

Lösungen gibts dafür wohl keine oder? ;)
Wobei mir 2 Matrizen reichen sollten...

Vielen Dank nochmal für die schnelle Hilfe / Tips!
Echt ein klasse Forum :)


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 16 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Einsteiger-Fragen


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 13 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.024s | 19 Queries | GZIP : On ]