【问题标题】:GL_INVALID_VALUE at glTexImage2DglTexImage2D 处的 GL_INVALID_VALUE
【发布时间】:2014-07-23 13:05:45
【问题描述】:

调用 glTexImage2D() 后出现 GL_INVALID_VALUE 错误

GLCheckForErrors();  // no error
glTexImage2D(GL_TEXTURE_2D, 0, GL_RED, width, height, 0, GL_RED, GL_UNSIGNED_BYTE, 0);
GLCheckForErrors();  // error printed here

我已将宽度和高度的值分别替换为 512 和 512,它解决了我的问题。这让我相信这是一个二次幂问题。但我不明白的是,我认为我正在使用的 opengl 版本有 NPOT 纹理?

OpenGL Version - 4.1 INTEL-8.28.30
GLSL Version - 4.10
Renderer - Intel HD Graphics 5000 OpenGL Engine

这应该支持 NPOT 纹理吧?

谢谢

【问题讨论】:

  • 按照规范,您的代码确实应该可以工作。您可以尝试的是:1)用 GL_R8 替换第一个 GL_RED,2)使用 4 的倍数宽度(也可能是高度)。
  • 这是我的宽度参数超过 24,000。我认为它太大了(它是字体纹理的一行字符)。所以我刚刚删除了我正在加载的不必要的字符,现在它工作正常。

标签: c++ opengl


【解决方案1】:

我的宽度参数似乎太大(超过 24,000)。

我在一个长纹理中加载了一系列字符,所以我所做的只是删除了不必要的字符以降低宽度,我不再收到该错误。

另一种解决方案是只设置一个固定宽度,然后再增加(但这对我来说并不容易,因为每个字符都有一个可变宽度)。

来自glTexImage2D() man page的相关错误情况是:

如果宽度或高度小于 0 或大于 GL_MAX_TEXTURE_SIZE,则生成 GL_INVALID_VALUE。

纹理大小的限制可以通过glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)查询。

【讨论】:

  • 您应该能够查询纹理大小限制。 24kx24k 是 576MB 的纹理,相当大
  • 它是 24k 乘以 200,因为它的路很长。所以还不错。它现在小了很多。
  • 相关错误情况为:“如果宽度或高度小于0或大于GL_MAX_TEXTURE_SIZE,则生成GL_INVALID_VALUE。”您可以使用glGetIntegerv(GL_MAX_TEXTURE_SIZE, ...)查询最大值。
猜你喜欢
  • 2017-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-12
  • 1970-01-01
相关资源
最近更新 更多