エディターでノードを接続するためにフラグメント シェーダーのみでベジエ曲線を描画したい。ベジエ曲線を定義する 4 つの点はすべて知っています。Fragment Shader はすべてのピクセルに対して呼び出されるため、確認することができます: gl_Coord.x の "t" が 0 と 1 の間にある場合は、たとえば、frag_color を Red に設定します。非効率なシェーダーのループを回避したい。最良の方法は、曲線上にあるポイントをチェックすることだと思います。しかし、ベジエ曲線の場合はどうすればよいでしょうか?
3次ベジェ方程式から「t」変数を表現することは可能ですか?
x = ((1-t)^3 * p0.x) + (3 * (1-t)^2 * t * p1.x) + (3 * (1 - t) * t^2 * p2.x) + (t^3 * p3.x);
t = ?
Web サイトの Wolfram Aplha で、その式を (GetBezierT 関数で) 教えてください。しかし、式は間違った「t」値を与え、曲線の代わりに放物線の半分を持っています:
#version 150
.....
layout (origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord;
out vec4 frag_color;
.....
vec4 BackgroundColor = vec4(0.15, 0.15, 0.15, 1.0);
vec2 p0 = vec2(61.0f,87.0f);
vec2 p1 = vec2(181.0f, 39.0f);
vec2 p2 = vec2(283.0f, 178.0f);
vec2 p3 = vec2(416.0f, 132.0f);
float getBezierT(float x, float a, float b, float c, float d)
{
return float(sqrt(3) *
sqrt(-4 * b * d + 4 * b * x + 3 * c * c + 2 * c * d - 8 * c * x - d * d + 4 * d * x)
+ 6 * b - 9 * c + 3 * d)
/ (6 * (b - 2 * c + d));
}
void main() {
.....
frag_color = BackgroundColor;
.....
float tx = getBezierT(gl_FragCoord.x, p0.x, p1.x, p2.x, p3.x);
float ty = getBezierT(gl_FragCoord.y, p0.y, p1.y, p2.y, p3.y);
if (tx >= 0.0f && tx <= 1.0f && ty >= 0.0f && ty <= 1.0f)
{
if(abs(tx-ty) < 0.01f) // simple check is that one point with little bias
frag_color = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}
}
アップデート
ミスをする。探しても無駄だと思いましたt
。我慢しようと思いました。Salix alba
しかし、とで与えられた答えの後、が に等しい場合、これはこの点が曲線上にあることを意味することStratubas
に気付きました。各点の式では、 との両方に の値が代入されているからです。異なる場合があり、この曲線上のポイントを与えることもできますが、それは無視できます。ベジエ曲線を構築するアルゴリズムは、直線的に増加して式に代入することを意味し、曲線がどれだけねじれても問題ありません。アルゴリズムは、曲線に沿って次の各点の座標を順番に返します。tX
tY
t
x
y
tX
tY
t
したがって、まず最初に、この質問をもう一度開きます: 3 次ベジエ方程式から変数 t を表現するにはどうすればよいですか?
tを表現してみましたが、めちゃくちゃ難しいです。「科学的目的」のためのこのアプローチの有効性を評価する必要があります =)。ここで質問する前にいろいろ調べましたが、この方法を使おうとしている人はいませんでした。理由を理解する必要があります。
更新 2
あなたは素晴らしい仕事をしました!こんなに詳しい回答をいただけるとは思っていませんでした。まさに私が必要としていたもの。すべてを確認する時間をください =)
更新 3
結論: t
3 次ベジェ方程式からの の正確な表現。時間のかかる作業ですが、近似値は実用的ではありません。この問題を解決するには、方程式データを分析し、パターンを見つけて、ベジエ曲線を構築するための新しい式を開発する必要があります。変数間の新しい関係によりt
、異なる方法で表現することが可能になります。の値に応じて、式の 4 つの部分の関数によって生成される 4 つの係数 ( - )x
による制御点の座標の積の合計の形で 3 次ベジエ式を表す場合 v0
v3
t
. これにより、式 x = ax * v0 + bx * v1 + cx * v2 + dx * v3 が得られます。下の表を見ると、変数t
の式が 4 つの未知数を持つ方程式であることがわかります。係数の値とそれらの間の関係の両方が、V
反復ごとに予測できない方法で変化するためです。その新しい抽象的な公式を見つけることは、この質問と私の能力の範囲を超えています。
皆さんの作業、特にSpektre
レンダリング アルゴリズムを最適化するための独自の開発と努力に感謝します。あなたのアプローチは私にとって最良の選択です=)