2

SDL + OpenGL を使用してこの小さなゲームを作成しました。ゲームは私の PC では正常に動作しますが、友人の PC では白いボックスと空白の画面が表示されます。

テクスチャの次元が 2 のべき乗ではないため、問題になるのではないかと考えました。テクスチャの寸法を変更することはできないので、いくつか検索した結果、GL_ARB_texture_non_power_of_twoを使用すると何らかの形で npot テクスチャが強制 (?) されることがわかりました。しかし、驚いたことに、白いボックスなどは PC に表示され、友達にも表示されません。何が問題なのか理解できません。どんな助けでも大歓迎です。

コード:

   numColors = images[i]->format->BytesPerPixel;
   if ( numColors == 4 )
   {
       if (images[i]->format->Rmask == 0x000000FF)
           textureFormat = GL_RGBA;
       else
           textureFormat = GL_BGRA;
   }
   else if ( numColors == 3 )
   {
       if (images[i]->format->Rmask == 0x000000FF)
           textureFormat = GL_RGBA;
       else
           textureFormat = GL_BGRA;
   }
   glPixelStorei(GL_UNPACK_ALIGNMENT,4);
   glGenTextures( 1, &textures[i] );
   glBindTexture( GL_ARB_texture_non_power_of_two, textures[i] );
   glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_ARB_texture_non_power_of_two,GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   glTexImage2D(GL_ARB_texture_non_power_of_two, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels);
4

3 に答える 3

1

GL_TEXTURE_2D の代わりに GL_ARB_texture_non_power_of_two を使用しないでください。拡張機能がサポートされているかどうかを確認してから、glTexImage(GL_TEXTURE_2D, w, h, ...) を使用して NPOT テクスチャを送信します。

glGetError() を呼び出して、エラーが発生しているかどうかを確認します。GL_ARB_...npot は有効な値ではないため、使用する必要があります。

GL_ARB_NPOT は、1D および 3D テクスチャにも使用されます。

于 2011-03-12T22:13:42.510 に答える
1

あなたの友人のビデオ カードは 2 の累乗でないテクスチャをサポートしていない可能性があります。したがって、GL_ARB_texture_non_power_of_two 拡張機能を使用しても、出力は依然として正しくありません。

ゲームが正しく表示するために特定の OpenGL 拡張機能に依存している場合は、起動時にそれらの拡張機能を確認し、ユーザーのハードウェアに機能がない場合はゲームを実行できないことをユーザーに伝える必要があります。

于 2011-03-12T20:56:59.413 に答える
0

ARB_texture_non_power_of_two に加えて、別の拡張もあります: GL_ARB_texture_rectangle; かなり古いもので、GPU によって長い間サポートされてきました。それを使用すると、コードは次のようになります

glPixelStorei(GL_UNPACK_ALIGNMENT,4);
glGenTextures( 1, &textures[i] );
glBindTexture( GL_TEXTURE_RECTANGLE_ARB, textures[i] );
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, numColors, images[i]->w, images[i]->h, 0, textureFormat, GL_UNSIGNED_BYTE, images[i]->pixels);

ところで: GL_ARB_texture_non_power_of_two は拡張名であり、テクスチャ ターゲットとして使用する有効なトークンではありません。OpenGL は GL_INVALID_ENUM エラーを発行する必要がありました。

于 2011-03-12T23:19:09.010 に答える