3

SOIL を使用して OpenGL テクスチャを生成しています。SOIL でのミップ マップの生成によって引き起こされる遠方のアーティファクトを除いて、すべて問題ありません。フラグを使用しない場合:

SOIL_FLAG_MIPMAPS

アーティファクトではありませんが、見栄えが悪いです。このようなアーティファクトを見た人はいますか?水の上はあずき色で、砂の上は薄緑/青の歪みのように見えます。

これは次のようになります。

ここに画像の説明を入力

4

2 に答える 2

3

私の推測では、ミップマップを生成するために使用するものにはバグがあり、ミップ レベルを適切にフィルタリングしません。前のレベルのピクセルが保存されている「有効な」領域の外からランダムな色が「漏れる」か、値の計算を忘れます。一部のピクセルの場合。つまり、ミップマップ チェーンの最後のレベルのみに影響するバグがあります。

これが原因であることを確認するには、ロードしたテクスチャのミップ レベルからデータを読み戻します。glReadPixels などを使用します。最後のミップ レベルにガベージが含まれている場合は、テクスチャのロード ルーチンに問題があります。GL_LINEAR_MIPMAP_NEAREST フィルターを使用して、紫色のピクセルで特定のミップ レベルがあるかどうかを確認することもできます。

この問題を回避するには、最初のレベルのイメージを生成し、glGenerateMipmaps(OpenGL 3+)、glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);(OpenGL 2+ または OpenGL 1.4+ - どのバージョンで追加されたか忘れました。OpenGL 3+ では非推奨)、または gluBuild2DMipMap(古い OpenGL バージョン) を使用します。 )。

または、ミップマップを自分で計算することもできます。ボックス フィルターの実装は難しくありません。Gaussian も難しくありません。

数式を使用してテクスチャを生成する場合 (「生成する」と言ったため)、別の考えられるシナリオは、数式が最後のミップ レベルで計算エラーを引き起こし、ガベージ カラーが表示されることです。

さらに別の考えられるシナリオは、ハードウェアの障害 (クーラーが壊れた過熱した GPU でどのような画像が得られるか信じられないでしょう) またはドライバーのバグです。しかし、それはあなたのプログラムだけでなく、多くのアプリケーションでアーティファクトを引き起こすはずです.

于 2012-02-14T00:09:31.663 に答える
0

異方性フィルタリングが役立つ場合があります。

// right after you set your GL_TEXTURE_MIN/MAG_FILTER
if( glewIsSupported("GL_EXT_texture_filter_anisotropic") )
{
    GLfloat max;
    glGetFloatv( GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &max );
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max);
}

または、ロード/テクスチャ座標エラーのようなものですが、確かに十分な情報 (つまり、問題を示す完全で最小限のプログラム) はありません。

于 2012-01-31T20:20:52.477 に答える