DGL
https://delphigl.com/forum/

"Tiefenshader" nur etwas anders
https://delphigl.com/forum/viewtopic.php?f=20&t=6618
Seite 1 von 1

Autor:  Lord Horazont [ Do Mai 24, 2007 14:05 ]
Betreff des Beitrags:  "Tiefenshader" nur etwas anders

Hi @ll

Der Titel mag vielleicht in anbetracht des Sinns etwas verwirrend sein, aber was besseres ist mir gerade nicht eingefallen.

Ich möchte gerne die Wassertiefe in einer Szene in eine Textur rendern. Eigentlich schien das ganz einfach, ich müsste ja nur die Y-Koordinate nehmen und vielleicht noch mit einem Faktor verrechnen und dann als Farbe darstellen - Das klappte allerdings nicht.

Das Problem ist, dass ich immer auf falsche ergebnisse kam. Bis jetzt bin ich einfach noch nicht darauf gekommen, wie ich es richtig machen kann. Hier mal mein Shadercode:

Code:
  1.  
  2. varying vec4 vpos;
  3. varying vec4 cpos;
  4. varying vec4 cutpos;
  5. uniform float planey;
  6. uniform int mode;
  7. uniform mat4 cm;
  8.  
  9. void main(void)
  10. {
  11.   vpos            = gl_Vertex;
  12.   cpos            = gl_ModelViewMatrix * gl_Vertex;
  13.   cutpos          = gl_ModelViewMatrix * vec4(1.0, 0.0, 0.0, 1.0);
  14.   gl_Position     = gl_ModelViewProjectionMatrix * gl_Vertex;
  15.   gl_TexCoord[0]  = gl_MultiTexCoord0;
  16.   gl_FrontColor   = gl_Color;
  17.  
  18. }

(^ Vertexshader)

Code:
  1.  
  2. varying vec4 vpos;
  3. varying vec4 cpos;
  4. varying vec4 cutpos;
  5. uniform float planey;
  6. uniform int mode;
  7. uniform mat4 cm;
  8.  
  9. void main(void)
  10. {
  11.   float diff;
  12.   diff = cutpos.y - cpos.y;
  13.   gl_FragColor = vec4(diff, diff, diff, 1.0);
  14. }
  15.  

(^ Fragmentshader)

Das Problem ist bei diesem Shader, dass der Farbverlauf immer relativ zur Kamera ist, dass heißt, wenn ich die Kamera bewege (bzw. im moment nur drehe) dann bewegt sich der Verlauf nicht mit, also ich habe immernoch nach oben hin meinen Verlauf von schwarz nach weiss, obwohl die Wasserfläche ganz anders steht.
Weiss da wer was, wie ich das lösen kann?

//Edit: Bei unklarheiten oder verständnisfragen: scheut nicht hier nachzufragen

Gruß Lord Horazont

Autor:  La Boda [ Do Mai 24, 2007 15:55 ]
Betreff des Beitrags: 

Versuch's mal ohne die Multiplikation mit der Modelview-Matrix. Dann dürfte es klappen, außer du verwendest Transformationen, um deine Geometrie zu beeinflussen...

Autor:  Lord Horazont [ Do Mai 24, 2007 15:56 ]
Betreff des Beitrags: 

Jep, die Geometrie wird rotiert. Wenn ich die Multiplikation weglasse, dann geht es, bis ich die Rotation des Würfels einschalte.

Gibt es da irgendein workaround?

Gruß Lord Horazont

Autor:  Speedmaster [ Sa Mai 26, 2007 22:18 ]
Betreff des Beitrags: 

Multipliziere es nur mit der Modelmatrix, und nicht mit der Viewmatrix.
Zudem funktioniert das nicht ganz so hübsch aussehen mit der einfachen Technik.

Mit dem Thema Wassershader bin ich im moment stark beschäftigt, habe leider den Code nicht hier( Wobei hier Wassertiefe, Lichteinfall & Co mit berechnet werden ).

Autor:  Lord Horazont [ So Mai 27, 2007 09:43 ]
Betreff des Beitrags: 

Hi Speedmaster

nur Modelmatrix? Wie geht das, es gibt doch nur gl_ModelViewMatrix und gl_ModelViewProjectionMatrix, oder?

Gruß Lord Horazont

Autor:  Speedmaster [ So Mai 27, 2007 17:55 ]
Betreff des Beitrags: 

Übergib die Modelmatrix als Uniform mat4.
Das setzt natürlich vorraus das du die Modelmatrix per hand erstellt hast und nicht irgendwie mit glPush und glPop das ganze gemacht hast.

mfg

Speedmaster

Autor:  Lord Horazont [ Mi Mai 30, 2007 16:25 ]
Betreff des Beitrags: 

Was meinst du? Soll ich die Operationen, die ich nach der Kamera gemacht habe als Matrix übergeben?

Gruß Lord Horazont

Autor:  Speedmaster [ Do Mai 31, 2007 10:23 ]
Betreff des Beitrags: 

Lord Horazont hat geschrieben:
Was meinst du? Soll ich die Operationen, die ich nach der Kamera gemacht habe als Matrix übergeben?

Gruß Lord Horazont


Du übergibst nur eine LookAtMatrix( View Matrix ) und multiplizierst diese mit deinem Vertex.


Hier mal bisl Code:
Meine Berechnung der Distance des Vertexpunktes zu Kamera im Bezug auf meine Maximale ViewDistance( DirectX HLSL )
Code:
  1.  
  2.  // Output the transformed position
  3. OUT.Position = mul( IN.Position, matViewProjection );
  4. // Output the scene depth
  5. OUT.Depth = OUT.Position.z / MaxViewDistance;



Farbverlauf in Y Richtung:
Code:
  1.  
  2. float4 transformedPosition = mul(IN.Position, matView);
  3. float yDepth = clamp( (transformedPosition.y - YMin)  / (YMax - YMin), 0, 1);

Autor:  Pellaeon [ Fr Jun 01, 2007 19:24 ]
Betreff des Beitrags: 

Kannst du es nicht wie beim Shadow Mapping machen?
Nimm doch einfach den transformierten z-Wert ausm Vertexshader. Bei OGL geht der dann von -1..1, wenn du einen anderen Bereich willst, musst entsprechend anpassen. Nur mit dem w musst du aufpassen, also evtl dann im transformierten z Wert noch durch w nehmen.

Autor:  Lord Horazont [ Sa Jun 02, 2007 09:55 ]
Betreff des Beitrags: 

Nein. Das Problem ist ja, dass ich nicht von oben auf die Wasserfläche schaue. Dann würde das Problemlos gehen, ich brauche aber den Abstand von einer XZ-Ebene auf Höhe Y=0.

Gruß Lord Horazont

Autor:  Pellaeon [ Sa Jun 02, 2007 12:50 ]
Betreff des Beitrags: 

Hm oder du machst etwas Mathematik.
Vertex + Lichtrichtung ist eine Gerade.
Du schaust wo diese Gerade deine Ebene schneidet. 2 Punkte -> Abstand berechnen.

Seite 1 von 1 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/