0

glCopyTexImage2D() を使用して、ゼロ以外のミップマップ レベルのテクスチャをアップロードしたいと考えています。同じために次のコードを使用しています:

// Render Some Geometry

GLint mipmap_level = 1;

glGenTextures(1, &textureId);
glBindTexture(GL_TEXTURE_CUBE_MAP, textureId);

glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);  

glCopyTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,mipmap_level,GL_RGBA16_SNORM,0,0,128,128,0);
// Five other glCopyTexImage2D() calls to load textures

glGenerateMipmap(GL_TEXTURE_CUBE_MAP);

//Render geometry

ここで、mipmap_level = 1 を使用すると、ジオメトリはまったく描画されません。ミップマップ レベルは glCopyTexImage2D() API とどのように連動しますか? level = 1 を使用すると、64x64 テクスチャ、つまり最初にサンプリングされたミップマップが読み込まれると思います。glCopyTexImage2D() の前に glGenerateMipmap() 呼び出しを使用しても意味がありません。それでは、 glCopyTexImage2D() を使用して、ドライバーがゼロ以外のミップマップ レベルをどのように正確にロードするのでしょうか?

4

1 に答える 1

2

最初にミップマップ レベル 1 のイメージを設定し、次に を呼び出して、最初のミップマップ レベル(ミップマップ レベル 0)glGenerateMipmapのイメージからミップマップを自動的に生成します。したがって、レベル 0 以降のすべてのミップマップ イメージは、自動生成されたイメージによって上書きされます。mipmap レベル 0 の画像をどのように設定したかは気にしません。設定したと仮定するだけです。一方、レベル 0 の画像を指定しているとは思わないので、おそらくごみが含まれているか、不完全と見なされ、対応するテクスチャの使用が失敗します。glGenerateMipmap

最後に、この質問が、ほとんどのプログラミング言語では通常 1 ではなく 0 からカウントを開始し、OpenGL も 1 からカウントを開始するということを知っているだけではないことを願っています。

編集: datenwolfが彼のコメントで指摘しているように、ミップマップ フィルタリングに使用するベース ミップマップ レベルを変更し、次の操作を実行して入力として使用できますglGenerateMipmap

glTexParamteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_BASE_LEVEL, 1);

ただし、0 ではなく 1 からカウントを開始したいという理由だけでこれを行わないでください。 一方、ミップマップ レベル 0 の有効な画像があり、レベル 1 に 1 つを設定し、これを他のレベルの計算に使用したい場合は、次に、呼び出す前にベースレベルを 1 に変更するglGenerateMipmap(そしておそらく後で 0 に戻す) ことは良い考えですが、このアプローチのユースケースをすぐに思いつくことはできません。

于 2012-11-20T09:02:19.957 に答える