4

エディターでノードを接続するためにフラグメント シェーダーのみでベジエ曲線を描画したい。ベジエ曲線を定義する 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に気付きました。各点の式では、 との両方に の値が代入されているからです。異なる場合があり、この曲線上のポイントを与えることもできますが、それは無視できます。ベジエ曲線を構築するアルゴリズムは、直線的に増加して式に代入することを意味し、曲線がどれだけねじれても問題ありません。アルゴリズムは、曲線に沿って次の各点の座標を順番に返します。tXtYtxytXtYt

したがって、まず最初に、この質問をもう一度開きます: 3 次ベジエ方程式から変数 t を表現するにはどうすればよいですか?

tを表現してみましたが、めちゃくちゃ難しいです。「科学的目的」のためのこのアプローチの有効性を評価する必要があります =)。ここで質問する前にいろいろ調べましたが、この方法を使おうとしている人はいませんでした。理由を理解する必要があります。

更新 2

あなたは素晴らしい仕事をしました!こんなに詳しい回答をいただけるとは思っていませんでした。まさに私が必要としていたもの。すべてを確認する時間をください =)

更新 3

結論: t3 次ベジェ方程式からの の正確な表現。時間のかかる作業ですが、近似値は実用的ではありません。この問題を解決するには、方程式データを分析し、パターンを見つけて、ベジエ曲線を構築するための新しい式を開発する必要があります。変数間の新しい関係によりt、異なる方法で表現することが可能になります。の値に応じて、式の 4 つの部分の関数によって生成される 4 つの係数 ( - )xによる制御点の座標の積の合計の形で 3 次ベジエ式を表す場合 v0v3t. これにより、式 x = ax * v0 + bx * v1 + cx * v2 + dx * v3 が得られます。下の表を見ると、変数tの式が 4 つの未知数を持つ方程式であることがわかります。係数の値とそれらの間の関係の両方が、V反復ごとに予測できない方法で変化するためです。その新しい抽象的な公式を見つけることは、この質問と私の能力の範囲を超えています。

V0-V3 係数表

皆さんの作業、特にSpektreレンダリング アルゴリズムを最適化するための独自の開発と努力に感謝します。あなたのアプローチは私にとって最良の選択です=)

4

3 に答える 3