私はopenglベースのGIS/マッピングプログラムを書き直しています。特に、このプログラムを使用すると、海図のラスターイメージをロードし、それらをlon / lat座標に修正し、ズームおよびパンすることができます。
以前のバージョンのプログラムは、カスタムタイリングシステムを使用しており、基本的に、元の画像のミップマップを、さまざまな2の累乗ズームレベルで256x256ピクセルのタイルの形式で手動で作成します。ズームレベルn-1のタイルは、単純な4点平均アルゴリズムを使用して、ズームレベルnの4つのタイルから構成されます。そのため、opengl mipmappingをオフにし、代わりに、チャートの一部をズームレベルで描画するときに、最も近いズームレベルのタイルを使用します(つまり、タイルは2の累乗ズームになります)。レベルが、プログラムは任意のズームレベルを許可します)そして実際のズームレベルに一致するようにタイルをスケーリングします。そしてもちろん、さまざまなレベルでこれらすべてのタイルのキャッシュを管理する必要があります。
このタイリングシステムは非常に複雑であるように私には思えました。グラフィックハードウェアにこのミップマップ作業のすべてを任せることができるはずだったようです。そのため、新しいプログラムでは、画像を読み込むときに、それぞれ1024x1024ピクセルのテクスチャに切り刻みます。次に、各テクスチャをそのlon / lat座標に固定し、ズームおよびパンしながら残りをopenglに処理させます。
それは機能しますが、問題は次のとおりです。元のプログラムよりも結果が少しぼやけています。これは、チャート上のテキストをできるだけ早くズーム方向に読み取れるようにするため、このアプリケーションにとって重要です。したがって、元のプログラムが使用する単純な平均4ポイントのアルゴリズムは、シャープネスの点で、opengl +myGPUよりも優れた結果をもたらすように見えます。
ミップマップの動作のいくつかの側面を制御するためのglTexParameter設定がいくつかあることを私は知っています。GL_TEXTURE_MAX_LEVEL(0から10までの任意の場所)とGL_TEXTURE_MIN_FILTERのさまざまな設定のさまざまな組み合わせを試しました。GL_TEXTURE_MAX_LEVELを0(ミップマップなし)に設定すると、確かに「シャープな」結果が得られますが、それもそうです。ピクセルがあちこちにドロップされるという意味でシャープであるため、中間ズームでは数値が読み取れません。GL_TEXTURE_MAX_LEVELをより高い値に設定すると、ズームアウトしたとき(たとえば、グラフ全体が画面に収まるとき)に画像が非常によく見えますが、中間ズームにズームインすると、特に見ているときにぼやけがわかります。チャート上のテキスト。(つまり、テキストがなかった場合、「うわー、openglは私の画像をスムーズに拡大縮小するのに素晴らしい仕事をしている」と思うかもしれませんが、テキストでは「なぜこのグラフの焦点が合っていないのですか?」と思います)
私の理解では、基本的にはopenglにミップマップを生成するように指示し、ズームインすると使用する適切なミップマップが選択されます。2つの最も近いミップマップレベル間を補間するためのいくつかの制限されたオプションがあり、最も近いピクセルを使用するか、近くのピクセル。ただし、私が言っているように、これらの組み合わせはいずれも、グラフの同じズームレベル(つまり、「7ポイント」や「以前のタイルベースのバージョンと同様に、8ポイント "サイズ)。
私の結論は、openglが作成するミップマップは、前のプログラムが平均4点アルゴリズムで作成したものよりも単純にぼやけており、適切なミップマップまたはLINEAR vs NEARESTを選択しても、必要なシャープネスが得られないということです。
特定の質問:
(1)openglが実際に元のプログラムの平均4点アルゴリズムよりもぼやけたミップマップを作成しているのは正しいように思われますか?
(2)openglが作成しているミップマップを使用してよりシャープな結果をもたらす可能性のあるglTexParameterの使用で見落としていた可能性のあるものはありますか?
(3)「キュービック」フィルターを使用したり、ミップマップ作成プロセスを制御したりするなど、最初にopenglを使用してよりシャープなミップマップを作成する方法はありますか?または、同じ平均4ポイントのコードを使用して、ミップマップを手動で生成し、openglに渡すことができるようです。しかし、私はそれを行う方法がわかりません...