SOIL を使用して OpenGL テクスチャを生成しています。SOIL でのミップ マップの生成によって引き起こされる遠方のアーティファクトを除いて、すべて問題ありません。フラグを使用しない場合:
SOIL_FLAG_MIPMAPS
アーティファクトではありませんが、見栄えが悪いです。このようなアーティファクトを見た人はいますか?水の上はあずき色で、砂の上は薄緑/青の歪みのように見えます。
これは次のようになります。
私の推測では、ミップマップを生成するために使用するものにはバグがあり、ミップ レベルを適切にフィルタリングしません。前のレベルのピクセルが保存されている「有効な」領域の外からランダムな色が「漏れる」か、値の計算を忘れます。一部のピクセルの場合。つまり、ミップマップ チェーンの最後のレベルのみに影響するバグがあります。
これが原因であることを確認するには、ロードしたテクスチャのミップ レベルからデータを読み戻します。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 でどのような画像が得られるか信じられないでしょう) またはドライバーのバグです。しかし、それはあなたのプログラムだけでなく、多くのアプリケーションでアーティファクトを引き起こすはずです.
異方性フィルタリングが役立つ場合があります。
// 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);
}
または、ロード/テクスチャ座標エラーのようなものですが、確かに十分な情報 (つまり、問題を示す完全で最小限のプログラム) はありません。