【问题标题】:OpenGL white textures on other PC其他 PC 上的 OpenGL 白色纹理
【发布时间】:2013-01-25 10:07:28
【问题描述】:

我使用 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);

【问题讨论】:

  • 白盒 PC 是否支持 NPOT 纹理?那个扩展只是
  • 抱歉,无意中发现了键盘。 NPOT 不是您可以启用的,它是 GPU 支持(或不支持)的东西。那么,故障 GPU 的扩展字符串中是否列出了 NPOT?
  • atm 无法找到这一点。输出图像来自我自己的电脑,一张使用 GL_TEXTURE_2D(正确的一张),另一张使用 GL_ARB_texture_non_power_of_two(白框)。您为什么认为使用此 ARB 扩展会导致问题?
  • 你不能“使用” GL_ARB_texture_non_power_of_two 而不是 GL_TEXTURE_2D?!?!请发布一些代码!
  • @tf61 GL_ARB_texture_non_power_of_two 不是纹理目标,将其用作枚举会产生 GL 错误,因此您的所有纹理调用都将被忽略。使用 glGetError() 查看错误。

标签: opengl textures texture-mapping


【解决方案1】:

您朋友的显卡可能不支持非幂次纹理,因此尽管使用了 GL_ARB_texture_non_power_of_two 扩展,但输出仍然错误。

如果您的游戏依赖特定的 OpenGL 扩展来正确显示,您应该在启动时检查这些扩展,并告诉用户如果他的硬件缺少这些功能,他将无法运行游戏。

【讨论】:

  • 我认为功能取决于驱动程序,对吧?我之所以这么问,是因为我已经看到游戏在两个都具有 Intel G31 芯片组 (GMA3100 IGP) 的系统上运行良好和糟糕。
  • 如果您想检查扩展:调用glGetString(GL_EXTENSIONS) 将返回一个以空格分隔的扩展名字符串,您的应用程序可以在运行时对其进行解析。
  • @Yuri:我的电脑支持 ARB 扩展,但输出仍然是白色的。有什么想法吗?
  • @tf61 well 你不能真正启用扩展。它要么受支持并且可以工作,要么根本不受支持。所以你现在得到白盒子的事实可能意味着你在某个地方搞砸了,就像以前一样。一种解决方法可能是 - 尽管相当难看 - 将图像重新缩放为 2 的幂,然后在您的程序中读取它们。如果您随后将它们绘制在与之前相同的四边形上,它们将重新缩放回原来的大小。除此之外,我没有想法......
  • 我的意思是当我使用普通 glEnable(GL_TEXTURE_2D) 到 glEnable(GL_ARB_...);我正在为纹理映射时的所有功能执行此操作。
【解决方案2】:

不要使用 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 纹理。

【讨论】:

  • 嗯.. 这意味着如果我的电脑支持 NPOT 纹理,我不应该使用 GL_ARB。没关系。你能推荐一些东西来让它在我朋友的电脑上运行吗?如果不完全 NPOT,那你觉得 SFML 能画出 npot 纹理吗?
  • 我说的是 SFML(sfml-dev.org) 库。
  • @tf61:您只需要将纹理填充到最近的 POT(如果内存允许的话),或者将它们收集到一个大纹理中(也就是图集,这也比单独的纹理更快) .我不知道 SFML,但它可能会帮助你。没有软件库可以改变硬件支持的内容,只能添加变通方法。
  • 和其他所有人:感谢您的支持。我已经切换到 SFML,一切正常。如果你想看看游戏,here it is
【解决方案3】:

除了 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 错误。

【讨论】:

  • 请注意,GL_TEXTURE_RECTANGLE 使用整数非标准化 texcoord(即 0...width 而不是 0..1 作为浮点数)。但它可以工作。
  • 从 OpenGL 扩展查看器中,我的图形芯片组似乎支持纹理矩形,但是当我使用它时,出现未声明的标识符错误。
  • @tf61:请展示一些你如何使用它的代码。一个完整的例子很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多