2

クワッドにマップしたい1024x1のグラデーションテクスチャがあります。このグラデーションは、そのクワッド内の線(p1、p2)に沿って配置する必要があります。テクスチャにはGL_CLAMP_TO_EDGEプロパティがあるため、クワッド全体が塗りつぶされます。

クワッドの四隅(A、B、C、D)のテクスチャ座標を把握する必要がありますが、必要な計算に頭を包むことができません。

画像

(p1、p2)の間の角度を計算してから、(p1,2)の間の線の中心を中心にコーナーポイントを回転させようとしましたが、これを正しく機能させることができませんでした。とにかく少し過剰に思えます-もっと簡単な解決策はありますか?

4

2 に答える 2

4

シェーダーを使用していますか?はいの場合は、クワッドに 0 から 1 までのデフォルトの UV を割り当てます。次に、p1 p2 セグメントの勾配に基づいて、回転角度を計算します (それらをラジアンに変換することを忘れないでください)。次に、頂点シェーダーで 2x2 回転マトリックスを構築し、UV をセグメントで定義された量だけ回転させます。最後に、回転した UV をフラグメント シェーダーに渡し、グラデーション テクスチャ サンプラーで使用します。

于 2013-01-23T19:54:57.130 に答える
0

加算、乗算、および1つのdivのみを使用して、実際に希望どおりに機能する別のアプローチを見つけました。高価な平方根を節約します。

まず、(p1、p2)線とそれに直交する線の傾きを計算します。次に、勾配(p1から開始)と各コーナーでの直交点の交点を計算します。

Vector2 slope = {p2.x - p1.x, p2.y - p1.y};
Vector2 ortho = {-slope.y, slope.x};

float div = 1/(slope.y * ortho.x - slope.x * ortho.y);
Vector2 A = {
    (ortho.x * -p1.y + ortho.y * p1.x) * div,
    (slope.x * -p1.y + slope.y * p1.x) * div
};
Vector2 B = {
    (ortho.x * -p1.y + ortho.y * (p1.x - 1)) * div,
    (slope.x * -p1.y + slope.y * (p1.x - 1)) * div
};
Vector2 C = {
    (ortho.x * (1 - p1.y) + ortho.y * p1.x) * div,
    (slope.x * (1 - p1.y) + slope.y * p1.x) * div
};
Vector2 D = {
    (ortho.x * (1 - p1.y) + ortho.y * (p1.x - 1)) * div,
    (slope.x * (1 - p1.y) + slope.y * (p1.x - 1)) * div
};
于 2013-01-24T17:11:00.433 に答える