WebGL
の円/楕円を1つのQuadとフラグメントシェーダを使って描画しています。ここでは、解像度に依存しない方法(エッジ距離アンチエイリアシング)WebGLシェーダの描画された円/楕円に一定の幅の輪郭を追加するにはどうすればいいですか?
は、現在、私のフラグメントシェーダです:
'#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);',
'}'
これはどんなサイズ完全にアンチエイリアスある黒い輪郭線とオレンジ色の円を作成します。
しかし、できるだけ早く私は、クワッドを変換として楕円に円を有効にするために、(それをスケーリング)、distance
計算は、アウトラインにも拡大させる、それに沿って変形します。私の理解は、私は何とかそれを反転させることによってクワッドの変換を説明する必要があるということです。
私が希望何distance
は、クワッドが丸ごと/楕円形の周りに一定の幅のアウトラインを生成する効果で、変換された場合でも均一なままにするためです。
ご迷惑をおかけして申し訳ございません。
ありがとうございます、私はあなたが言っていることを理解していると思います。だから私は、楕円の幅と高さを制服として渡したと仮定します。どのように脳卒中を計算するつもりですか? – gordyr
もしあなたがwidhtとheightを代わりに押して、それを外側から変換しないならば、それはいまのゲームのようなものです。あなたは本当にあなたが望むものを決める必要があります:フラグメントシェイダーで楕円とカスタムシェイプを描きますか?または、外部からの変換を行うか?問題は大きなものになり始めています。 –
フラグメントシェーダーで作業したい場合は、shadertoyを強くお勧めします。それはwebglよりもかなり小さく、理解しやすいものです。私が書いたこのデモはあなたのためのヒントかもしれません:https://www.shadertoy.com/view/4scSWr –