4

私は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に渡すことができるようです。しかし、私はそれを行う方法がわかりません...

4

2 に答える 2

11

(1)ありそうもない。ボックスフィルターを使用するだけで、平均4ポイントの効果があると思います。おそらく、あるテクスチャから別の瞬間に高解像度のものに切り替えるだけです。たとえば、「テクスチャされるピクセルのサイズに最も近いミップマップを選択する」ので、256x256マップを使用して383x383領域をテクスチャリングします。交換する手動システムは、ターゲットサイズが256x256以下になるまで、常に512x512から縮小されている可能性があります。

(2)ベースGLで認識しているわけではありませんが、GLSLとプログラム可能なパイプラインに切り替える場合、問題が次の場合に低解像度のマップが使用されている場合は、texture2Dに「bias」パラメーターを使用できます。あなたはそれを望まない。同様に、GL_EXT_texture_lod_bias拡張機能は、固定パイプラインでも同じことを実行できます。これは10年前のNVidia拡張機能であり、すべてのプログラム可能なカードで実行できることなので、おそらくそれを使用するでしょう。

(編集:拡張機能をより完全に読むと、テクスチャバイアスがバージョン1.4のOpenGLのコア仕様に移行しました。明らかに私のマニュアルページは非常に古くなっています。1.4仕様の279ページを確認すると、GL_TEXTURE_LOD_BIASを指定できます)

(3)はい— GL_GENERATE_MIPMAPを無効にすると、glTexImage2Dを使用して、スケールのすべてのレベルに必要な画像を提供できます。これは、「レベル」パラメーターで指定されます。したがって、必要に応じて、完全に無関係なミップマップを提供できます。

于 2011-05-13T08:56:36.260 に答える
1

あなたの特定のポイントに答えるために、あなたが言及する4ポイントフィルタリングはボックスフィルタリングと同等です。これは、高次のフィルターよりもぼやけが少なくなりますが、エイリアシングパターンが発生する可能性があります。最高のフィルターの1つは、ランツォシュフィルターです。Lanczosフィルターを使用して、ベーステクスチャからすべてのミップマップレベルを計算し、グラフィックカードの異方性フィルタリング設定を上げることをお勧めします。

元のコードは、グラフィックスメモリに収まらないほど大きいデータセットを表示するように設計されているため、テクスチャ自体を管理していると思います。これはおそらく過去にはもっと大きな問題でしたが、それでも懸念事項です。

于 2011-10-20T20:24:18.690 に答える