ライン ストリップとして使用される頂点のセットが 2 つあります。
- 頂点1
- 頂点2
これらの頂点は動的であるため、以前は不明な値を持っていることを知っておくことが重要です。
これら 2 つの間にアニメーションのトランジション (モーフ) を作成したいと考えています。私はこれを行うための2つの異なる方法を思いつきました:
オプション1:
頂点シェーダーで0 - 1の Time ユニフォームを設定します。ここで、次のようなことができます。
// Inside main() in the vertex shader
float originX = Position.x;
float destinationX = DestinationVertexPosition.x;
float interpolatedX = originX + (destinationX - originX) * Time;
gl_Position.x = interpolatedX;
ご覧のとおり、これには 1 つの問題があります。 「DestinationVertexPosition」を取得するにはどうすればよいですか?
オプション 2:
頂点シェーダーの外側で補間計算を行います。各頂点をループし、補間された値の 3 番目の頂点セットを作成し、それを使用してレンダリングします。
// Pre render
// Use this vertex set to render
InterpolatedVertexes
for (unsigned int i = 0; i < vertexCount; i++) {
float originX = Vertexes1[i].x;
float destinationX = Vertexes2[i].x;
float interpolatedX = originX + (destinationX - originX) * Time;
InterpolatedVertexes[i].x = interpolatedX;
}
アイデアを明確にするために、これら 2 つのコード スニペットを非常に単純化しました。
さて、2 つのオプションから、シェーダー レベルで何かが発生することを考えると、最初のオプションがパフォーマンスの点で明らかに優れているように感じます。また、 「時間」が更新されるたびに新しい頂点のセットを作成する必要はありません。.
問題の概要を説明したので、次の 3 つのことのいずれかを評価します。
- OpenGL ES 2 (iOS) で望ましい結果を達成するためのより良い方法についての議論。
- 「DestinationVertexPosition」を提供するか、何らかの方法でアイデアを変更して、同じ結果をより適切に達成することにより、オプション 1を適切に実装する方法についての説明。
- オプション 2の実装方法に関するディスカッション。