其他PC上的OpenGL白色纹理

时间:2011-03-12 20:46:49

标签: opengl textures texture-mapping

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

3 个答案:

答案 0 :(得分:1)

您朋友的视频卡可能不支持两种纹理的非功能,因此尽管使用了GL_ARB_texture_non_power_of_two扩展名,但输出仍然是错误的。

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

答案 1 :(得分: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纹理。

答案 2 :(得分: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);

BTW:GL_ARB_texture_non_power_of_two是扩展名,不是用作纹理目标的有效标记; OpenGL应该发出GL_INVALID_ENUM错误。