什么是纹理内存,由 OpenGL 分配,受限制?

Posted

技术标签:

【中文标题】什么是纹理内存,由 OpenGL 分配,受限制?【英文标题】:What is texture memory, allocated with OpenGL, limited by? 【发布时间】:2014-08-02 22:52:36 【问题描述】:

我正在使用 OpenGL 制作 2D 游戏。我关心的是纹理内存消耗。 2D 游戏使用的纹理内存比 3D 游戏多几个数量级,其中大部分来自动画帧和背景。

显然,程序可以分配多少纹理内存是有限制的,但是是什么决定了这个限制?限制是来自程序可用的通用内存,还是受到 GPU 上可用视频内存的限制?它可以使用交换空间吗?当显存耗尽时会发生什么?

【问题讨论】:

【参考方案1】:

OpenGL 的内存模型非常抽象。包括 2.1 在内的版本有两种内存快速“服务器”内存和慢速“客户端”内存。但是没有可以以任何方式查询的限制。当 OpenGL 实现用尽“服务器”(=GPU) 内存时,它可能会开始交换或仅报告“内存不足”错误。

OpenGL-3 取消了(大多数情况下,OpenGL-4 完成了这项工作)使用两种不同的内存。只有“内存”,限制是相当随意的,取决于程序运行的 OpenGL 实现(= GPU + 驱动程序)。所有 OpenGL 实现都完全能够交换一段时间未使用的纹理。因此,唯一会遇到内存不足的情况是尝试创建一个非常大的纹理。较新的 GPU 实际上能够根据需要交换部分纹理。事情会变慢,但继续工作。

显然,程序可以分配多少纹理内存是有限制的,但是是什么决定了这个限制?

系统的 OpenGL 实现细节,取决于系统中安装的内存量。

【讨论】:

另外,我想说这还取决于框架如何处理纹理本身,例如“MegaTextures”/虚拟纹理的情况。

以上是关于什么是纹理内存,由 OpenGL 分配,受限制?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定Android OpenGL ES上的最大纹理内存

OpenGL-纹理(下)

受彩色矩形影响的所有纹理颜色 - OpenGL

OpenGL ES 压缩纹理

OpenGL纹理管理

如何在 OpenGL 中将多个纹理分配到单个网格中?