其他PC上的OpenGL白色纹理

其他PC上的OpenGL白色纹理,opengl,textures,texture-mapping,Opengl,Textures,Texture Mapping,我用SDL+OpenGL制作了这个小游戏。这个游戏在我的电脑上运行得很好,但在朋友的电脑上,他只能看到白色的盒子和空白的屏幕 我认为这可能是一个问题,因为我的纹理是非2维幂。我无法更改纹理尺寸,因此经过一些搜索后,我发现使用GL_ARB_texture_non_power_of_two会以某种方式强制(?)npot纹理。但是,令我惊讶的是,这些白色的盒子和东西出现在我的电脑上,而我的朋友们甚至没有看到。我无法理解问题是什么。任何帮助都将不胜感激 代码: 您朋友的视频卡可能不支持两种纹理的非幂次,

我用SDL+OpenGL制作了这个小游戏。这个游戏在我的电脑上运行得很好,但在朋友的电脑上,他只能看到白色的盒子和空白的屏幕

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

代码:


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


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

不要使用GL\u ARB\u texture\u non\u power\u of \u of \u two而不是GL\u texture\u 2D。只需检查扩展是否受支持,然后使用glTexImage(GL_TEXTURE_2D,w,h,…)发送NPOT纹理

调用glGetError()以查看是否出现错误。您应该这样做,因为GL\u ARB\unpot在使用时不是有效值


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

除了ARB_纹理_非_二次幂之外,还有另一个扩展:GL_ARB_纹理_矩形;相当古老,它已经被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\u无效\u枚举错误。

白盒PC是否支持NPOT纹理?那个分机很抱歉,在键盘上绊倒了。NPOT不是您可以启用的,而是GPU支持(或不支持)的。那么,NPOT是否列在发生故障的GPU的扩展字符串中?找到它是不可能的。输出图像来自我自己的电脑,一个使用GL_纹理_2D(正确的一个),另一个使用GL_ARB_纹理_非二次幂(白色框)。为什么你认为使用这个ARB扩展会导致问题?你不能“使用”GL_ARB_texture_non_power_of_two而不是GL_texture_2D?!?!请发布一些代码@tf61 GL_ARB_texture_non_power_of_two不是纹理目标,将其用作枚举会生成GL错误,因此将忽略所有纹理调用。使用glGetError()查看错误。我认为功能取决于驱动程序,对吗?我这样问是因为我看到游戏在两个都使用Intel G31芯片组(GMA3100 IGP)的系统上运行得很好和不好。如果您想检查扩展名:调用
glGetString(GL_extensions)
将返回一个以空格分隔的扩展名字符串,您的应用程序可以在运行时对其进行分析。@Yuri:我的电脑支持ARB扩展,但输出仍然是白色的。有什么想法吗?@tf61嗯,你不能真正启用扩展。它要么被支持并工作,要么根本不受支持。所以,你现在得到的是白盒子,这可能意味着你在某个地方搞砸了,就像以前一样。一种解决方法是——尽管相当丑陋——将图像重新缩放到2的幂,然后在程序中读取它们。如果然后在与之前相同的四边形上绘制它们,它们将被重新缩放回其原始尺寸。除此之外,我没有想法…我的意思是,当我使用普通格伦表(GL_纹理_2D)到格伦表(GL_ARB_…)时,它工作良好;我在纹理贴图时对所有函数都这样做。嗯。。这意味着如果我的电脑支持NPOT纹理,我就不应该使用GL_ARB。那很好。你能为在我朋友的电脑上运行提供一些建议吗?如果它不能完全NPOT,那么您认为SFML能够绘制NPOT纹理吗?我说的是SFML(SFML-dev.org)库。@tf61:您只需将纹理填充到最近的容器中(如果内存允许),或者将它们收集到一个大纹理中(也称为atlas,这也比单独的纹理快)。我不知道SFML,但它可能会对您有所帮助。没有软件库可以更改硬件支持的内容,只能添加变通方法。其他人:感谢您的支持。我已切换到SFML,一切正常。如果您想查看游戏,请注意GL_TEXTURE_RECTANGLE使用整数非规格化texcoord(即0…width而不是0…1作为浮动)。但它可以工作。从OpenGL Extensions viewer中,我的图形芯片组似乎支持纹理矩形,但当我使用它时,我得到了未声明的标识符错误。@tf61:请显示一些代码,说明如何使用它。一个完整的例子很好。
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);