Ich zeichne Kreise/Ellipsen in WebGL
mit einem einzigen Quad und einem Fragment - Shader, um sie in a zu zeichnen auflösungsunabhängige Art und Weise (Randabstand Anti-Aliasing)Wie kann ich dem WebGL - Shader gezeichnete Kreise/Ellipsen (gezeichnet mit Kanten -/Distanz - Antialiasing) einen einheitlichen Breitenumriss hinzufügen
Hier ist mein Fragment-Shader zur Zeit:
'#extension GL_OES_standard_derivatives : enable',
'precision mediump float;',
'varying vec2 coord;',
'vec4 circleColor = vec4(1.0, 0.5, 0.0, 1.0);',
'vec4 outlineColor = vec4(0.0, 0.0, 0.0, 1.0);',
'uniform float strokeWidth;',
'float outerEdgeCenter = 0.5 - strokeWidth;',
'void main(void){',
'float dx = 0.5 - coord.x;',
'float dy = 0.5 - coord.y;',
'float distance = sqrt(dx*dx + dy*dy);',
'float delta = fwidth(distance);',
'float alpha = 1.0 - smoothstep(0.45 - delta, 0.45, distance);',
'float stroke = 1.0 - smoothstep(outerEdgeCenter - delta, outerEdgeCenter + delta, distance);',
'gl_FragColor = vec4(mix(outlineColor.rgb, circleColor.rgb, stroke), alpha);',
'}'
Dies schafft einen orangefarbenen Kreis mit einem schwarzen Umrisse, die perfekt antialiased ist unabhängig von der Größe.
aber sobald ich das Quad (skalieren), um verwandeln den Kreis in eine Ellipse zu drehen, die distance
Berechnung transformiert mit ihm zusammen, so dass die Kontur auch skalieren. Mein Verständnis ist, dass ich irgendwie die Transformation des Vierecks erklären müsste, indem ich es umkehre.
Was würde ich ist wie für die distance
einheitlich zu bleiben, auch wenn das Quad umgewandelt wird, in der Tat eine konstante Breite Umriss um den gesamten Kreis/Ellipse zu erzeugen.
Jede Hilfe würde sehr geschätzt werden.
Danke, ich glaube, ich verstehe, was Sie sagen. Vorausgesetzt, ich habe die Breite und Höhe der Ellipse als Uniformen durchlaufen. Wie würde ich den Schlaganfall berechnen? – gordyr
Nun, wenn du stattdessen Breite und Höhe drückst und du es nicht von außen transformierst, dann ist es jetzt ein anderes Spiel. Sie müssen wirklich entscheiden, was Sie wollen: Ellipsen und benutzerdefinierte Formen im Fragment-Shader zeichnen? Oder machen Sie Transformationen von außen? Die Frage beginnt zu groß zu werden. –
Falls Sie mit Fragment Shader arbeiten wollen, empfehle ich dringend sharttoy. Es ist kleiner als webgl und einfacher zu verstehen.Diese Demo, die ich richtig geschrieben habe, könnte ein Hinweis für dich sein: https://www.shadertoy.com/view/4scSWr –