3

OpenGLでミップマップを実装するのに問題があります。私はOpenFrameworksを使用しており、ミップマップの作成とレンダリングをサポートするようにofTextureクラスを変更しました。

次のコードは、クラスの元のテクスチャ作成コードです(わかりやすくするために少し変更されています)。

  glEnable(texData.textureTarget);
      glBindTexture(texData.textureTarget, (GLuint)texData.textureID);
      glTexSubImage2D(texData.textureTarget, 0, 0, 0, w, h, texData.glType, texData.pixelType, data);
      glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
      glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glDisable(texData.textureTarget);

これは、ミップマップをサポートする私のバージョンです。

  glEnable(texData.textureTarget);
       glBindTexture(texData.textureTarget, (GLuint)texData.textureID);
       gluBuild2DMipmaps(texData.textureTarget, texData.glTypeInternal, w, h, texData.glType, texData.pixelType, data);
       glTexParameteri(texData.textureTarget, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
       glTexParameteri(texData.textureTarget, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
  glDisable(texData.textureTarget);

コードはエラーを生成せず(gluBuild2DMipmapsは「0」を返します)、テクスチャは問題なくレンダリングされます。しかし、違いは見られません。

私がレンダリングするシーンは、z=0の「平らな正方形のタイル」で構成されています。基本的には2Dシーンです。タイルを描画する前に、「glScale()」を使用してズームインおよびズームアウトします。ズームアウトすると、タイルテクスチャのピクセルが「踊り」始め、(私が知る限り)フィルタリングされていないテクスチャルックアップを示します。参照:http ://www.youtube.com/watch?v = b_As2Np3m8Aat25s。

私の質問は、カメラの位置を移動せず、シーン全体のスケーリングのみを使用するため、OpenGLが適切なミップマップレベルを決定できず、フルテクスチャサイズ(レベル0)を使用することを意味しますか?

ポール

4

2 に答える 2

1

ミップマッピングは、遠近距離に加えてシーンのスケールを補正します。頂点シェーダー出力 (独自のシェーダーを使用していない場合でもドライバーが作成します) は、各頂点のスクリーン空間座標とそれらの頂点のテクスチャ座標を指定します。GPU は、生成されるフラグメントのテクセルとピクセルの比率に基づいて、使用するミップ レベルを決定します。

GL_LINEAR_MIPMAP_LINEARタイルをレンダリングするときも設定していますか? テクスチャを作成/ロードするときではなく、レンダリングするときにのみ重要です。実際に渡されている状態に応じて、ブラケット glEnable/glDisable 呼び出しも移動する必要がある場合があります。

于 2010-05-25T19:47:15.203 に答える
-1

OpenGL >= 1.4 をターゲットにしている場合は、おそらく自動ミップマップ生成に切り替える必要があります。

GL_TEXTURE_MIN/MAX_LOD特定のミップ レベルを強制するように変更を試みることができます。

于 2010-05-25T19:14:56.437 に答える