【发布时间】:2017-12-05 19:07:07
【问题描述】:
在 OpenGL 中可以创建的纹理数量是否有限制 - 即使用 glGenTextures?
我知道 GL 施加了一些限制,例如。可以在片段着色器中使用的纹理数量。但是,我找不到任何关于可用的整数“纹理名称”总数的文档。
【问题讨论】:
在 OpenGL 中可以创建的纹理数量是否有限制 - 即使用 glGenTextures?
我知道 GL 施加了一些限制,例如。可以在片段着色器中使用的纹理数量。但是,我找不到任何关于可用的整数“纹理名称”总数的文档。
【问题讨论】:
glGenTextures 的唯一限制是纹理名称的位宽(GLint),即 32 位;事实上,纹理名称的数量可能非常多,以至于您在生成纹理名称时可能永远不会遇到问题。
纹理的限制是图形系统的内存。 OpenGL 实现仅在应用程序使用 glTexImage2D (以及其他可用的 glTexImage* 函数)提交纹理数据时知道纹理大小和格式,它指定宽度、高度和内部纹理格式:具有这些参数可以确定存储纹理数据所需的内存。
要检查错误,您应该使用 glGetError 查询 OpenGL 错误,如果操作未能分配所需的内存,则返回 GL_OUT_OF_MEMORY。 glGenTextures 和 glTexImage2D 等也可能返回此错误。
这个错误最有可能由glTexImage2D等返回,因为纹理分配所需的内存远大于将纹理名称标记为已用所需的内存。
【讨论】:
glTexImage 时使用GL_PROXY_TEXTURE_*D 进行某种试运行。这样做可以避免错误。这是否有价值,我不确定,因为我不认为 glTexImage 失败可能会导致任何严重问题,但仍然值得知道(特别是如果你想测试系统能力)。
您可以生成的纹理名称的数量没有限制。然而,纹理内存是有限制的,因此由于内存限制,实现仍然可能导致 glGenTextures 调用失败。
所以不要创建一堆纹理名称然后不使用它们。创造你需要的东西。
【讨论】: