我有一个纹理,用作纹理贴图。它是一个 2048 x 2048 的纹理,被划分为每个 256 像素的正方形。所以我有 64 个“插槽”。此地图可以是空的、部分填充的或已满的。在屏幕上,我正在绘制简单的正方形,每个正方形都有一个精灵贴图的插槽。
问题是当插槽的资产可用时,我必须不时更新此地图。这些资产是从互联网上下载的,但初始信息会提前到达,所以我可以知道我将使用多少个插槽,并查看本地存储以检查哪些插槽已经可以在开始时绘制。
例如。我的信息说将有 10 个方块,其中 5 个在本地可用,所以当初始化精灵贴图时,这些方块已经填充并准备好绘制。在屏幕上,我将显示 10 个方块。其中 5 个将图像存储在这些插槽的纹理图中,其余 5 个使用时间图像绘制。下载插槽的新资产后,我想用新的相应纹理更新我的精灵贴图(绑定并用于绘图),在绘制完成并且精灵贴图更新后,我设置了一个标志,告诉OpenGL,它应该使用该插槽而不是时间图像开始绘制。
根据我的阅读,有 3 种方法可以更新精灵图。
1)用glTextImage2D上传一个新的:我目前正在使用这种方法。我将创建另一个更新纹理,然后简单地交换它。但我经常遇到内存警告。
2) 使用 glTextSubImage2D 修改纹理:我无法让它工作,我不断收到内存访问错误或黑色纹理。我相信它要么是因为线程不一样,要么我正在访问正在使用的纹理。
3)使用帧缓冲区对象:我可以试试这个,但我不确定我是否可以在纹理缓冲区已经被使用时绘制它。
解决这个问题的正确方法是什么?
这意味着要在 iPhone 上使用,因此资源有限。
编辑:我发现这篇文章谈到了这里的相关内容。
不幸的是,我不认为它专注于修改当前正在使用的纹理。