Die perspektivische Version optischer Täuschung ist super, es bleibt aber das Problem bis ein Objekt den Boden oder ein anderes Objekt berührt!
1.) ... Das erste Beispiel mit Lösung schwer zu bedienen!
2.) ... Das zweite Beispiel leicht zu verstehen!
3.) ... Wozu das Ganze mit gl_FragDepth, gl_DepthRange, ....?
1.) Das erste Beispiel mit Lösung schwer zu bedienen!
Das verhält sich nicht wie ein für den Tiefenpuffer vorgesehenes Objekt. Was das betrifft, ist es nur ein Kreis!Hier die Lösung: https://paroj.github.io/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html
Ein Teil der Ausgabe des Fragment-Shaders ist ein Tiefenwert. Wenn Sie keinen schreiben, verwendet OpenGL gerne gl_FragCoord.z die Tiefenausgabe des Fragment-Shaders. Dieser Wert wird einem Tiefentest gegenüber dem aktuellen Tiefenwert unterzogen und, wenn der Test bestanden wird, in den Tiefenpuffer geschrieben.
https://paroj.github.io/gltut/Illumination/Tutorial%2013.html
(Bild-1) Wie kann ich in OpenGL! |
Verwandt:
https://www.cl.cam.ac.uk/teaching/1718/FGraphics/6.%20Advanced%20Shader%20Techniques.pdf
2.) Das zweite Beispiel leicht zu verstehen!
https://www.raywenderlich.com/2323-opengl-es-pixel-shaders-tutorial
(Bild-2) Gl_FragDepth Manipulation! |
Bei der Arbeit mit einer 3D-Kugel macht die Normalisierung von Vektoren Gleichungen viel einfacher, und das Gleiche gilt für prozedurale Texturen, insbesondere Rauschen. Funktionen wie Glättung und Interpolation sind viel einfacher, wenn sie auf einem quadratischen Gitter ausgeführt werden.
3.) Wozu das Ganze mit gl_FragDepth, gl_DepthRange, ....?
Gut zu wissen ist es alle mal, da man einfach auch mal anders 3D Objekte darstellen kann, man darf nie vergessen dass egal wie man vorgeht, es 3D nicht gibt und dass es nur eine Illusion ist. Ob man Dreiecke oder andere Formeln verwendet ist hierbei unwichtig, nur das Ergebnis und der bessere Schein zählen hier!
Wie bei allem anderen zählt, dass das Einfachste zumeist auch das Beste ist!
Weitere Links:
Quellcode für MS Visual Studio 10:
http://tubafun.bplaced.net/public/sphere_shader.zip
Beschreibung:
http://11235813tdd.blogspot.com/2013/04/raycasted-spheres-and-point-sprites-vs.html!
Berechnung von gl_FragDepth ;-)
/*something*/ = Position im Raum
https://microeducate.tech/glsl-gl_fragcoord-z-calculation-and-setting-gl_fragdepth/
https://stackoverflow.com/questions/10264949/glsl-gl-fragcoord-z-calculation-and-setting-gl-fragdepth
Zum Verstehen auch gut:
►► http://www.songho.ca/opengl/gl_transform.html
float far=gl_DepthRange.far; float near=gl_DepthRange.near;
vec4 eye_space_pos = gl_ModelViewMatrix * /*something*/
vec4 clip_space_pos = gl_ProjectionMatrix * eye_space_pos;
float ndc_depth = clip_space_pos.z / clip_space_pos.w;
float depth = (((far-near) * ndc_depth) + near + far) / 2.0;
gl_FragDepth = depth;
Implementieren von weichen Partikeln in WebGL und OpenGL Partikel sind eine der einfachsten Möglichkeiten, das visuelle Erscheinungsbild einer Szene zu verbessern. Über gl_FragDepth, gl_FragCoord.z, gl_FragCoord.w kann man hier deutlich an Rechenleistung einsparen!
https://keaukraine.medium.com/implementing-soft-particles-in-webgl-and-opengl-es-b968d61133b0
(Bild-3) Gl_FragDepth Manipulation, Täuschung auch für Partikel Effekte! |
https://github.com/ssloy/glsltuto
(Bild-4) Gl_FragDepth Manipulation, Täuschung und Effekte! |