Also, ich habe einen Betrüger (die echte Geometrie ist ein Würfel, möglicherweise abgeschnitten, und die Betrüger Geometrie ist ein Menger Schwamm) und ich muss seine Tiefe berechnen.GLSL gl_FragCoord.z Berechnung und Einstellung gl_FragDepth
Ich kann die Menge berechnen, um im Weltbereich ziemlich leicht zu versetzen. Leider habe ich Stunden damit verbracht, die Tiefe nicht zu stören.
Die einzig richtige Ergebnisse kann ich, wenn ich gehen:
gl_FragDepth = gl_FragCoord.z
Grundsätzlich muss ich wissen, wie gl_FragCoord.z berechnet wird, so dass ich kann:
- die inverse Transformation Nehmen von gl_FragCoord.z in den Augenraum
- Fügen Sie die Tiefenstörung hinzu
- Transformieren Sie diese gestörte Tiefe zurück in den gleichen Raum wie das Original gl_FragCoord.z.
Ich entschuldige mich, wenn dies wie eine doppelte Frage scheint; Es gibt eine Reihe von anderen Posts, die ähnliche Dinge ansprechen. Nach der Implementierung von allen funktioniert jedoch keiner ordnungsgemäß. Anstatt zu versuchen, einen auszuwählen, um Hilfe zu bekommen, frage ich an dieser Stelle nach komplettem Code, der das tut. Es sollte nur ein paar Zeilen sein.
Haben Sie auch einen Vertex-Shader geschrieben? oder nur ein Fragment-Shader? –
Ich werde Ihnen keinen Code im Allgemeinen geben, aber ich kann Ihnen [diesen Link zum OpenGL Wiki] (http://www.opengl.org/wiki/Compute_eye_space_from_window_space) geben. Sowie diesen Link zu einem Tutorial von mir auf [Betrüger und Tiefe, die zeigt, wie dies auch zu tun] (http://www.arcsynthesis.org/gltut/Illumination/Tut13%20Deceit%20in%20Depth.html). Die Tiefe zurück zu transformieren ist trivial. –
Michael: Ja, aber es ist nur ein Durchlauf durch Shader.Wie dem auch sei, die Berechnungen werden im Welt-Raum durchgeführt, sodass ich den Augenraum im Fragment-Programm berechnen kann. Nicol, ich hatte diese Seite schon gesehen. Ich implementiere es als: vec4 clip_pos = gl_ProjectionMatrix * vec4 (eye_pos, 1.0); float ndc_depth = clip_pos.z/clip_pos.w; gl_FragDepth = (((clip_far-clip_near) * ndc_depth) + clip_near + clip_far)/2.0; Leider scheint die Tiefe außerhalb des Tiefenbereichs zu liegen, obwohl kein Offset vorhanden ist. Danke, – imallett