2

我使用 SDL + OpenGL 制作了这个小游戏。游戏在我的电脑上运行良好,但在朋友的电脑上,他只是得到白框和黑屏。

我认为这可能是一个问题,因为我的纹理在维度上不是 2 的幂。我无法更改纹理尺寸,因此经过一番搜索,我发现使用GL_ARB_texture_non_power_of_two会以某种方式强制(?)npot纹理。但是,令我惊讶的是,我的电脑上出现了白框和其他东西,而我的朋友们甚至都没有。我无法理解问题所在。任何帮助将不胜感激。

代码:

   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_ARB_texture_non_power_of_two 代替 GL_TEXTURE_2D。只需检查是否支持扩展,然后使用 glTexImage(GL_TEXTURE_2D, w, h, ...) 发送 NPOT 纹理。

调用 glGetError() 以查看是否出现错误。您应该,因为 GL_ARB_...npot 在您使用时不是有效值。

GL_ARB_NPOT 也用于 1D 和 3D 纹理。

于 2011-03-12T22:13:42.510 回答
1

你朋友的显卡可能不支持非两个纹理的幂,因此尽管使用了 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 回答