6

iOS 描画アプリがあります。現在、描画は OpenGL ES 1.1 で実装されています。ベジエ曲線などの線を滑らかにするために、いくつかのアルゴリズムを使用します。そのため、タッチ イベントが発生すると、(アルゴリズムに基づいて) タッチ イベント ポイントからポイントのセットを取得し、これらのポイントを描画します。また、ポイントにはブラシ テクスチャを使用して、より自然な外観にしています。

これらのアルゴリズムを OpenGL ES 2.0 シェーダーに実装できるかどうか疑問に思っています。OpenGL 関数を呼び出してタッチ ポイントで構成される線を描画し、出力時にブラシ テクスチャの曲線を滑らかにレンダリングするようなものです。

ここに画像の説明を入力

ここでのポイント P0、P1、... P4 はタッチ イベントであり、赤い曲線上のポイント - 出力ポイントであり、曲線上の 2 つの隣接ポイント間の距離が 1 ピクセルを超えないように、T にそのようなステップが設定されています。

そして、ここにベジエアルゴリズムの説明へのリンクがあります: ベジエ曲線 - ウィキペディア、フリー百科事典

どんな助けでも大歓迎です。ありがとう。

4

1 に答える 1

6

頂点シェーダー内で新しい頂点を生成することはできません (ES にはないジオメトリ シェーダーで生成できます)。出力頂点の数は常に入力頂点の数と同じです。それらの位置 (およびもちろん他の属性) のみを変更できます。

したがって、十分に滑らかな曲線を保証するために、十分な頂点から作成されたライン ストリップを描画する必要があります。できることは、曲線パラメーター値 T を 1D 頂点位置として常に同じライン ストリップに配置することです。シェーダーでは、この入力位置 (パラメーター値) を使用して、DeCasteljau アルゴリズム (または何でも) を使用して曲線上の実際の 2D/3D 位置を計算し、シェーダーに定数 (均一変数) として入れるポイント P0 から P4 を計算します。 GLSL用語で)。

しかし、CPU でこれらのポイントを計算して動的 VBO に入れるだけで本当に何かが得られるかどうかはわかりません。節約できるのは、CPU から GPU へのカーブ ポイントのコピーと CPU での計算ですが、一方で、頂点シェーダーははるかに複雑です。どちらがより良いアプローチであるかを評価する必要があります。フレームごとにカーブ ポイントを計算する必要があり (コントロール ポイントはフレームごとに変化するため)、カーブがかなり詳細である場合、それはそれほど悪い考えではないかもしれません。でも、そうじゃないと本当に稼げないと思います。また、シェーダーは、実行時に変化する制御点/曲線度の数に簡単に適応できません。

ただし、5 つの制御点を配置して、GPU で N 個の曲線点を生成することはできません。頂点シェーダーは常に単一の頂点で動作し、結果として単一の頂点が生成されます。フラグメント シェーダーが常に単一のフラグメント (まだピクセルではありませんが、ピクセルなど) で動作し、単一の (またはまったくない) フラグメントを生成するのと同じです。 .

于 2012-07-07T21:17:32.113 に答える