20

最初にテクスチャを作成したのは私であり、ロード/生成したミップマップの数を完全に把握している必要があります。私はユニットテストのためにこれをやっています。glGetTexParameterこれを見つけるためのパラメーターはないようです。私が来た最も近いものは次のようなものです:

int max_level;
glGetTexParameter( GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, &max_level );
int max_mipmap = -1;
for ( int i = 0; i < max_level; ++i )
{
    int width;
    glGetTexLevelParameter( GL_TEXTURE_2D, i, GL_TEXTURE_WIDTH, &width );
    if ( 0 == width )
    {
        max_mipmap = i-1;
        break;
    }
)

とにかく、glGetTexLevelParameter()NVidia GPU を使用している場合、存在しないミップマップに対して幅 0 を返しますが、Mesa では をGL_INVALID_VALUE返します

テクスチャに取り込んだミップマップ レベルを確認するにはどうすればよいですか?

4

3 に答える 3

14

これについては、仕様がやや曖昧です。GL_INVALID_VALUElevel パラメータが「許容される最大の詳細レベルより大きい」場合に取得されると書かれています。これがどのように定義されているかは正確には述べられていません。

関数のドキュメントでは、可能な限り最大のテクスチャ ( ) の可能な最大 LOD 数であると述べて、それを少し明確にしていGL_MAX_TEXTURE_SIZEます。glFramebufferTextureファミリのような他の同様の関数は、これを の制限として明示的に述べていGL_INVALID_VALUEます。だから私はそれを期待します。

したがって、メサにはバグがあります。GL_INVALID_VALUEただし、0 またはエラーのいずれかが mipmap 配列の末尾から外れたことを意味すると想定することで、これを回避できます。

そうは言っても、採用してglTexStorage、二度と質問する必要さえないことをお勧めします。これにより、誰かが MAX_LEVEL を大きすぎる値に設定することを強制的に防止できます。これは GL 4.2 からのかなり新しいものですが、まだサポートされているすべての非 Intel ハードウェアに実装されています (またはすぐに実装される予定です)。

于 2012-03-05T19:38:00.720 に答える
2

標準的な方法でミップマップを構築していると仮定すると、一意の画像の数は ceil(log_2(max(width,height)))+1 のようになります。これは、ミップマップが 1 つのピクセルになるまで毎回画像サイズを 2 分の 1 に縮小することに注意することで簡単に導き出すことができます。

于 2012-03-24T21:53:23.797 に答える