【问题标题】:How to catch glTexImage2D error when resolution is incompatible?分辨率不兼容时如何捕获 glTexImage2D 错误?
【发布时间】:2012-12-22 22:52:53
【问题描述】:

我正在尝试捕捉来自

中不兼容的图像纹理分辨率的错误
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, img->width, img->height, 0, GL_RGB, GL_UNSIGNED_BYTE, imgdata);


1. Compatible resolution, working fine = 1024x1024, 1920x1200, 1920x1080, 704x891
2. Incompatible resolutions, all giving error = 2058x1734, 1018x1280, 591x602, etc.

我不知道为什么 glTexImage2D 在 #1 分辨率下工作正常,而在 #2 分辨率下会出错。我无法提取它遵循的分辨率模式,这意味着某些分辨率工作正常,而另一些则不行。我不知道为什么。

现在的问题是,如果用户尝试创建分辨率不兼容的纹理,则 OpenGL 应该会捕获错误,如果未创建纹理但 glTexImage2D 没有返回任何内容,我应该得到 0,因此我们无法为用户提供安全的东西好的。 “不支持此分辨率,请勿使用。”但问题是 OpenGL 没有捕捉到 glTexImage2D 错误。

在运行时执行期间

cout<<until here working fine..<<endl;

glTexImage2D(......) run-time execution stops here and windows gives not responding error.

cout<<"output of something that never executed"<<endl;
Here If I use glGetError() it never works. Because windows gives error in glTexImage2D.

那么,有谁知道我如何捕捉 glTexImage2D 错误。如果它给出错误,那么我会显示“不使用此图像,使用另一个图像”。并返回 0。

如何完成这个任务? 我还考虑过仅以某些分辨率限制用户,但这不是解决方案。对吧?

【问题讨论】:

  • 模式明智,我只能看到非工作纹理不是 4 像素宽的倍数。
  • 我想是的,你是对的。那你觉得我可以这样限制吗? if(imgW%4 == 0) 然后创建纹理。对吗?
  • 您不应该这样做,似乎存在不同的潜在问题。您确定您的图像数据对那些非工作尺寸有效吗?即您的图像加载器是否传递了 glTexImage 的虚假指针?
  • (虽然如果它确实是驱动程序问题,并且限制纹理大小有效,那么到底是什么 - 破解总比崩溃好......)
  • 好的,我刚刚做的是,我将不兼容的图像调整为兼容的图像,它工作正常。那么,现在的问题是什么?

标签: opengl textures texture-mapping texture2d glteximage2d


【解决方案1】:

在您的情况下不接受的那些图像格式不是 4 的倍数。这引出了一个问题:您是否设置了像素存储参数?设置所有GL_UNPACK_… 参数以匹配您的图像数据就在调用 glTexImage。 GL_UNPACK_ALIGNMENT 对您的问题特别感兴趣。

http://www.opengl.org/sdk/docs/man/xhtml/glPixelStore.xml

【讨论】:

  • 我明白了你的意思,但把 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);就在 glTexImage2D() 之前?还是在哪里?
  • 你是对的。我用 glPixelStorei(GL_UNPACK_ALIGNMENT, 1); 解决了它// 这对于避免无效的图像分辨率非常重要。图像宽度应在 glTexImage2D 中除以 4 (image->width%4 == 0)。 glPixelStorei 使纹理兼容。
  • @furqan:我确实在我的回答中写了,把调用 glPixelStore 放在哪里。为了强调,我用粗体重新格式化了已经存在的节。
【解决方案2】:

这看起来像是一些奇怪的驱动程序错误。无论您传递什么,OpenGL 调用都不应崩溃(只要它不是无效指针或指针操作的大小错误)。此外,我没有看到纹理加载失败的任何模式。

通常应该只有三个关于有效纹理的限制能力: 纵横比和尺寸:

  • 纹理可能太高或太宽而无法处理。
  • 较旧的卡片可能要求纹理为方形(宽度 = 高度)。
  • 较旧的卡片可能要求纹理尺寸为 2 的幂(宽度 = 2n;高度 = 2m)。

我在你的纹理尺寸中看不到任何真实的图案。

纹理格式(即颜色深度/颜色通道)可能是另一个问题,但不要认为这实际上涉及到这里。

【讨论】:

  • 我没有使用较旧的 GPU,它的 Nvidia GeForce GT 220 512 MB。颜色或通道在这里不是问题,因为相同的图像在调整为兼容的分辨率后工作。 JasonD 发现可能是模式宽度应该除以 4。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-10
  • 2020-09-08
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多