Ich habe einige einfache Polygone (weniger als 20 Vertices), die flach auf einer einfachen xy-Ebene rendern, mit GL_TRIANGLES und einer flachen Farbe, einer 2D-Simulation.Einen Rahmen an einem 2D-Polygon mit einem Fragment-Shader zeichnen
Ich möchte diesen Polygonen einen Rahmen mit variabler Dicke und einer anderen Farbe hinzufügen. Ich habe etwas implementiert mit den gleichen Vertices und glLineWidth/GL_LINE_LOOP, das funktioniert, aber ist ein anderer Rendering-Durchlauf und wiederholt alle Vertex-Transformationen.
Ich denke, ich sollte dies in der Fragment-Shader mit gl_FragCoord und die Vertex-Daten und/oder Textur-Koordinaten tun können, aber ich bin mir nicht sicher, und meine naiven Versuche waren offensichtlich falsch.
Ich stelle mir etwas wie folgt vor.
uniform vec2 scale; // viewport h/w
uniform float line_width;
uniform vec4 fill_color;
uniform vec4 border_color;
varying vec4 vertex; // in world coords
void main()
{
if (distance_from_edge(gl_FragCoord, vertex, scale) < line_width)
{
// we're close to the edge the polygon, so we're the border.
gl_FragColor = border_color;
}
else
{
gl_FragColor = fill_color;
}
}
Der Teil Ich versuche, die distance_from_edge Funktion, um herauszufinden, ist - wie das berechnet werden kann? Verwendet gl_FragCoord den falschen Ansatz - sollte ich eine Art Textur-Mapping verwenden?
Als Experiment habe ich versucht, den Vertex in Pixelraum mit der Skala zu konvertieren, und dann den Abstand zwischen diesem und gl_FragCoord in Pixeln zu berechnen, aber das gibt seltsame Ergebnisse, die ich nicht wirklich verstanden habe. Plus ich brauche den Abstand zum Rand, nicht der Scheitelpunkt, aber ich bin mir nicht sicher, wie man das bekommt.
Irgendwelche Ideen?
EDIT: basierend auf Nicol Antwort, meine Frage ist:
Ich habe als Kantenscheitelpunkte ein Dreieck mit 3 Eckenscheiteln Unter der Annahme, markiert, und ein Scheitelpunkt in der Mitte der Kante markiert als nicht (so mit 3 Dreiecken wiedergegeben in total), wie interpoliere ich dann im Fragment-Shader, um eine Grenze einer bestimmten Dicke zu zeichnen? Ich gehe davon aus, dass ich das Kanten-Flag an den Fragment-Shader sowie die gewünschte Linienstärke übergebe und eine Interpolationsberechnung durchführe, um den Abstand zwischen den Kanten- und Nicht-Kanten-Scheitelpunkten zu ermitteln und die Farbe als Grenze/Füllung entsprechend anzupassen ?
'gl_FragCoord' wird massiv sein nicht hilfreich für Sie. Das sagt Ihnen nur, wo das Fragment auf dem Bildschirm ist; es sagt nichts darüber aus, wo das Fragment relativ zum Dreieck ist. Die Vertex-Position wird ebenfalls massiv nicht hilfreich sein. Sie benötigen die Hilfe des Vertex-Shaders/der vom Benutzer bereitgestellten Daten, die Werte auf Scheitelpunkte basierend darauf, ob es sich um einen Kantenscheitelpunkt handelt, setzen und den Wert interpolieren. Das bedeutet, dass Sie die Kante eines einzelnen Dreiecks nicht erkennen können. Sie müssten das Dreieck in mehrere Dreiecke aufteilen, so dass innere Ecken und Kantenscheitel unterschieden werden können. –
Danke, ich vermutete, dass ich etwas verpasst habe. Also, wenn ich ein Dreieck mit 3 Eckpunkten habe, die als Eckpunkte markiert sind, und einem in der Mitte nicht (also mit 4 Dreiecken gerendert), wie interpoliere ich dann auf eine gegebene Linienbreite für den Rand? – bloodearnest