Frage

Ok, in meinem GLSL Fragment-Shader mag ich in der Lage sein, den Abstand des Fragments von einer bestimmten Linie im Raum zu berechnen.

Das Ergebnis davon ist, dass ich zum ersten Mal ein variierendes vec2 in meinem Vertex-Shader-Set zu verwenden ist versucht zu spiegeln, was in gl_FragCoord endet:

varying vec2 fake_frag_coord;
//in vertex shader:
gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex;
fake_frag_coord=(gl_ModelViewProjectionMatrix * gl_Vertex).xy;

Jetzt im Fragment-Shader erwarte ich:

gl_FragCoord.xy==fake_frag_coord

Aber es funktioniert nicht. Welche Operation macht die Pipeline auf gl_Position schalten Sie ihn in gl_FragCoord, die ich auf fake_frag_coord zu tun bin zu vernachlässigen?

War es hilfreich?

Lösung

gl_FragCoord sind Bildschirmkoordinaten, so dass Sie Informationen über die Bildschirmgröße haben bräuchten und so es zu produzieren, basierend auf der Position. Die fake_frag_coord Sie produziert haben zu einem Punkt auf dem Bildschirm in normalisierten Gerät entsprechen wird koordiniert Ich denke, (-1 bis 1). Wenn Sie also auf die Hälfte der Bildschirmgröße in einer bestimmten Dimension zu multiplizieren sind, und dann diese Größe hinzufügen, dann werden Sie aktuelle Bildschirmpixel erhalten.

Andere Tipps

Das Problem, das Sie haben, ist, dass gl_ModelViewProjectionMatrix * gl_Vertex in einem Shader berechnet ist nicht immer das, was die feste Funktion Pipeline Erträge. Um identische Ergebnisse zu erhalten, do fake_frag_coord = ftransform ().

Edit:

Und dann skalieren Sie es mit Ihren Bildschirmabmessungen.

Ich wünschte, ich mehr rep hatte so auch ich nitpick konnte. Hier ist, was ich weiß. OpenGL führt die Division durch W automatisch für Sie, so durch die Zeit, eine Position in einem Fragment-Shader ankommt, ist es bereits in NDC-Koordinaten, und dann wird W sein 1.0, die einzige Zeit, die Sie von W teilen müssen, ist, wenn Sie will die gleiche Mathematik auf der CPU-Seite zu tun, und die gleichen Ergebnisse erhalten, oder, wenn man aus irgendeinem Grunde, NDC-Koordinaten in Ihren Vertex-Shader bekommen wollte.

varying vec2 fake_frag_coord;
//in vertex shader:

fake_frag_coord=(gl_ModelViewMatrix * gl_Vertex).xy
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top