短縮版
ユーザーがズームインおよびズームアウトするときに座標を手動で再計算することなく、OpenGL マッピング アプリケーションで短いテキスト ラベルを描画するにはどうすればよいですか?
ロングバージョン
最大約 25 万ポイントのデータ セットを描画できるようにする必要がある OpenGL ベースのマッピング アプリケーションがあります。各ポイントには、通常 4 ~ 5 文字の短いテキスト ラベルを付けることができます。
現在、すべての文字を含む単一のテキストを使用してこれを行っています。ポイントごとに、ラベル内の各文字のクワッドを定義します。したがって、「Fred」というラベルの付いたポイントには 4 つのクワッドが関連付けられ、各クワッドはテクスチャ座標を使用してその単一のテクスチャに対応するキャラクターを描画します。
マップを描画するときは、マップ ポイント自体をマップ座標 (経度/緯度など) で描画します。次に、画面座標で各点の位置を計算し、その点のラベルの各クワッドの 4 つのコーナー ポイントを、再び画面座標で更新します。(たとえば、ポイントがスクリーン ポイント 100, 150 に描画されていると判断した場合、ポイントのラベルの最初の文字のクワッドを、左上のポイント 105, 155 で始まり、幅が特定の文字に適した 6 ピクセル、高さ 12 ピクセル. 次に、2 番目の文字は 120、155 などで始まります.) 次に、これらすべてのラベル文字クワッドが正しく配置されたら、直交スクリーンを使用してそれらを描画します.投影。
問題は、これらすべての文字クワッド座標を更新するプロセスが遅く、150k ポイントの特定のテスト データ セットで約 0.5 秒かかることです (つまり、各ラベルの長さは約 4 文字であるため、約 150k * [ 1 ポイントあたり 4 文字] * [1 文字あたり 4 座標ペア] アップデートごとに設定する必要がある座標ペア。
マップ アプリケーションにズームが含まれていなければ、更新のたびにこれらすべての座標を再計算する必要はありません。ラベルの座標を一度計算してから、表示用の四角形をシフトして正しい領域を表示するだけです。しかし、ズームでは、座標計算を行わないと機能させる方法がわかりません。そうしないと、ズームインすると文字が大きくなり、ズームアウトすると文字が小さくなります。
私が望んでいるのは (そして、OpenGL が提供していないと私が理解していること) は、固定された画面座標の四角形に四角形を描画する必要があることを OpenGL に伝える方法ですが、その四角形の左上の位置は、マップ座標空間内の特定のポイント。したがって、プリミティブ階層 (特定のマップ ポイントは、そのラベル キャラクター クワッドの親) と、この階層内で 2 つの異なる座標系を混在させる機能の両方が必要です。
私が設定できる魔法の変換マトリックスがあるかどうかを理解しようとしていますが、それを行う方法がわかりません。
私が検討したもう 1 つの方法は、各ポイントでシェーダーを使用して、そのポイントのラベル文字クワッド座標の計算を処理することです。私はこれまでシェーダーを扱ったことがなく、(a) シェーダーを使用してこれを行うことが可能かどうか、および (b) シェーダー コードでこれらすべてのポイントを計算することで、自分で計算するよりも実際に何かが得られるかどうかを理解しようとしています。 . (ちなみに、大きなボトルネックは、更新された座標を GPU にアップロードすることではなく、クワッド座標を計算することであることを確認しました。後者は少し時間がかかりますが、それは計算であり、更新される座標の数です。その 0.5 秒の大部分を占めます。)
(もちろん、別の方法としては、最初に特定のビューでどのラベルを描画する必要があるかをより賢くすることです。しかし、ここでは、すべてのラベルを描画する必要があると仮定して、解決策に集中したいと思います。)