生成 GL_INVALID_VALUE 错误。无效的纹理尺寸。立方体贴图纹理 427*240*6 [关闭]

Posted

技术标签:

【中文标题】生成 GL_INVALID_VALUE 错误。无效的纹理尺寸。立方体贴图纹理 427*240*6 [关闭]【英文标题】:GL_INVALID_VALUE error generated. Invalid texture dimensions. on Cubemap texture 427*240*6 [closed] 【发布时间】:2019-10-15 15:31:55 【问题描述】:

您好,我目前正在模拟一组 Nintendo Switch 游戏,显然我收到了 427x240 6 面的立方体贴图纹理。在该纹理上执行 glTextureStorage2D 时,我收到此错误:“GL_INVALID_VALUE 产生错误。纹理尺寸无效。”我在 OpenGL 规范中到处查看,但找不到适合这种情况的描述的限制。此外,我在我们的 Vulkan 后端进行了测试,它没有遇到任何验证层,并且可以毫无问题地接受它。

我做过的其他事情:

我已将这些数据一直跟踪到 TIC(TIC 是 NVIDIA Maxwell 2nd Gen 中的纹理描述符)。数据与模拟 GPU 真正想要的一致。我还在我们的 Vulkan 后端跟踪了纹理,所有数据都是一致的。 我检查过是否存在类似问题,找不到。

我应该向 NVIDIA 报告驱动程序错误还是我遗漏了什么?

在 NVIDIA GTX 1060 上使用 OpenGL 4.3。(如果有兴趣,可以使用 Vulkan 1.1)。

【问题讨论】:

【参考方案1】:

我收到一个 427x240 的立方体贴图纹理

立方体贴图面必须是正方形。它们不必是 2 的幂,但必须是平方。

是的,even in Vulkan:如果您创建“CUBE_COMPATIBLE”2D 图像,那么它的宽度和高度必须相等。如果您的验证层没有捕捉到这一点,那么它们有问题,或者您为它指定了正确的值,同时为 OpenGL 指定了错误的值。

确实,我很惊讶 Switch 的 GPU 允许这样做。甚至 AMD 的 Mantle 也需要方形立方体贴图面。

【讨论】:

我是这么想的,但我在规范中找不到任何禁止它的内容。 @FernandoAndreasSahmkowBeico:在哪个规范中?我将您链接到尽可能接近 Vulkan 中的 VU 规则(点击链接并搜索“CUBE_COMPATIBLE”)。至于 OpenGL,这些规则实际上是“立方体完整”规则的一部分。 是的,vulkan 规范禁止这样做,很奇怪。我将更新 SDK。我在问OpenGL规范。不过,我相信 NVM。 @FernandoAndreasSahmkowBeico:实际上,glTexImage2D 函数的 OpenGL 规范明确规定宽度/高度必须相同,否则会出现 GL_INVALID_VALUEglTexStorage2D 函数从 Image2D 函数继承错误。 好的,非常感谢。很抱歉浪费您的时间。我会看到 wtf 正在发生。

以上是关于生成 GL_INVALID_VALUE 错误。无效的纹理尺寸。立方体贴图纹理 427*240*6 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

glDrawElements 抛出 GL_INVALID_VALUE 错误

QOpenGLTexture::allocateStorage 导致 GL_INVALID_VALUE 错误

OpenGL 4.5 直接状态访问渲染一个三角形 - GL_INVALID_VALUE [重复]

OpenGl,glUseProgram() 返回 GL_INVALID_VALUE 即使着色器的 ID 是正确的 [重复]

glDrawArrays在GLESv2上抛出GL_INVALID_VALUE

来自 glFramebufferTexture2DEXT 的 GL_INVALID_VALUE 仅在删除/重新分配纹理之后