2

我有一个纹理,用作纹理贴图。它是一个 2048 x 2048 的纹理,被划分为每个 256 像素的正方形。所以我有 64 个“插槽”。此地图可以是空的、部分填充的或已满的。在屏幕上,我正在绘制简单的正方形,每个正方形都有一个精灵贴图的插槽。

问题是当插槽的资产可用时,我必须不时更新此地图。这些资产是从互联网上下载的,但初始信息会提前到达,所以我可以知道我将使用多少个插槽,并查看本地存储以检查哪些插槽已经可以在开始时绘制。

例如。我的信息说将有 10 个方块,其中 5 个在本地可用,所以当初始化精灵贴图时,这些方块已经填充并准备好绘制。在屏幕上,我将显示 10 个方块。其中 5 个将图像存储在这些插槽的纹理图中,其余 5 个使用时间图像绘制。下载插槽的新资产后,我想用新的相应纹理更新我的精灵贴图(绑定并用于绘图),在绘制完成并且精灵贴图更新后,我设置了一个标志,告诉OpenGL,它应该使用该插槽而不是时间图像开始绘制。

根据我的阅读,有 3 种方法可以更新精灵图。

1)用glTextImage2D上传一个新的:我目前正在使用这种方法。我将创建另一个更新纹理,然后简单地交换它。但我经常遇到内存警告。

2) 使用 glTextSubImage2D 修改纹理:我无法让它工作,我不断收到内存访问错误或黑色纹理。我相信它要么是因为线程不一样,要么我正在访问正在使用的纹理。

3)使用帧缓冲区对象:我可以试试这个,但我不确定我是否可以在纹理缓冲区已经被使用时绘制它。

解决这个问题的正确方法是什么?

这意味着要在 iPhone 上使用,因此资源有限。

编辑:我发现这篇文章谈到了这里的相关内容。

不幸的是,我不认为它专注于修改当前正在使用的纹理。

4

1 回答 1

0

线程不一样

OpenGL-ES API 绝对不是多线程的。从主线程更新您的纹理。因为你的纹理必须上传到gpu上,所以glTextSubImage2D是最快最简单的路径。保持这个方向:)

在帧缓冲区上渲染(附加在纹理上)对于渲染已经在 gpu 上的数据非常快。(不是你的情况)。是的,您可以在绑定到纹理的帧缓冲区上绘制(= 使用纹理作为颜色附件的帧缓冲区)。

只有一个约束:您不能在一次绘制调用中读取和写入相同的纹理(附加到当前帧缓冲区的纹理不能绑定到纹理单元)

于 2013-06-21T12:00:29.487 回答