【发布时间】:2013-08-12 16:11:04
【问题描述】:
这个问题是针对 Android 上的 OpenGL ES 2.0 的,但可能存在使用通用 GL 功能的变通方法,因此我将其标记为“opengl”。
tl;dr:在 OpenGL ES 2.0 中是否有另一种方法来指定 glPixelStorei(GL_UNPACK_ROW_LENGTH)?因为根据spec,OpenGL ES 2.0 中不存在GL_UNPACK_ROW_LENGTH。
我有一个纹理,我通过调用glTexImage2D 频繁更新该纹理,该纹理来自一个正在独立更新的客户端内存的固定区域。在某些情况下,我知道只有图像的一个子区域发生了变化。我可以通过调用glTexSubImage2d 并仅指定纹理的上半部分(例如)来限制更新的行数。这会显着提高性能。
但是当我尝试限制更新的列数时(比如我只想更新纹理的左上象限),我注意到没有 stride 参数为glTexSubImage2d。因为对于我的应用程序,作为所有glTexImage2d/glTexSubImage2d 源的客户端内存区域具有图像的全宽,如果我调用glTexSubImage2d,我需要将其指定为步幅。
glPixelStorei(GL_UNPACK_ROW_LENGTH,stride) 似乎是这样做的方法,但 OpenGL 2.0 ES 不支持GL_UNPACK_ROW_LENGTH。那么有没有办法在 OpenGL ES 2.0 中更新纹理的水平子区域?
【问题讨论】:
-
顺便说一句,即使更新整个纹理,您仍然应该使用
glTexSubImage2D而不是glTexImage2D(前提是您的纹理已经正确调整大小),因为后者将重新分配整个纹理,而前者只会更新其数据。使用glTexSubImage2D时,您的性能提升可能部分来自这一事实,而不是您仅更新子区域这一事实。