2

最近、OpenGLプログラムがnVidiaQuadro140カードを搭載した2年前のLenovoラップトップでテクスチャを正しくレンダリングしないという問題に遭遇しました。OpenGL2.1.2およびGLSL1.20を実行しますが、ミップマッピングをオンにすると、画面全体が黒くなり、警告やエラーは発生しません。

これは私のテクスチャフィルターコードです:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

40分間いじった後、ミップマッピングが問題であることがわかりました。オフにすると修正されました:

// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
// glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);

エイリアシングがたくさん発生しますが、少なくともプログラムは表示され、正常に実行されます。

最後に、2つの質問:

  1. OpenGLバージョンをチェックする以外に、ミップマッピングがマシンで利用可能かどうかをチェックするための最良または標準的な方法は何ですか?
  2. ミップマッピングが利用できない場合、エイリアシングを回避するための最良の回避策は何ですか?

編集:

これが私が本当に求めている質問です:

プラットフォームでミップマッピングが利用可能かどうかをプログラムでどのように確認しますか?

4

4 に答える 4

3

(GL_GENERATE_MIPMAPを使用した)自動ミップマップ生成のサポートにはOpenGL 1.4が必要です。ミップマップを使用したテクスチャリングは、ほぼすべてのグラフィックカードで利用できる必要があります。問題はミップマップ機能が欠落しているのではなく、ミップマップの生成が欠落している可能性があると思います。デバッグの目的で、gluBuild2DMipmaps?を使用してミップマップを生成してみてください。

この問題がこのグラフィックカード/構成に固有のものである場合は、更新されたドライバーを確認することもお勧めします。

エイリアシングを取り除く良い方法は、マルチサンプリングです。

于 2010-06-18T08:32:36.030 に答える
2

ミップマッピングが利用できない場合は、エイリアシングを避けたくないでしょう。ミップマッピングのないプラットフォームは、通常、問題を起こす価値がありません。

ただし、エイリアシングを本当に避けたい場合は、フラグメントごとのミップマッピングをプリミティブごとのミップマッピングで概算できます。まず、すべてのミップマップレベルを手動で生成して個別のテクスチャにアップロードする必要があります。三角形をレンダリングする前に、CPUで適切なミップマップレベルを計算し、このミップマップレベルに対応するテクスチャを使用します。大きなプリミティブのアーティファクトを回避するには、それらを細分化します。

于 2010-06-18T19:53:54.637 に答える
2

OpenGLでは、コアの一部であるすべてのテクスチャフォーマットがミップマッピングをサポートしている必要があります。そのため、テクスチャフォーマットがミップマッピングをサポートしているかどうかを確認する特定の方法はありません。

一部の拡張機能は、最初に導入されたとき、新しいフォーマット(特に、2つのテクスチャの非累乗とフロートテクスチャ)に対するこの制約を緩和していました。拡張機能自体は、ミップマッピングがまったくサポートされていないことを明らかにしました。しかし、それらがコアに統合される前に、ミップマッピングサポートの要件が復活しました。

于 2010-06-21T14:35:59.607 に答える
0

あなたの実装が本当にミップマップをサポートしていなかったら、私は非常に驚きます。1つ以上のレベルが欠落している可能性が高く、これは偶然に簡単に発生する可能性があります。

たった1つのミップレベルを見逃してミップマッピングを有効にすると、持っているものだけが黒くなります。1x1までのすべてのレベルが定義されていることを確認するか、それに応じてGL_TEXTURE_MAX_LEVELTexParameterを設定してください。

于 2011-03-02T20:49:52.070 に答える