如何使用opengl-es 3.0访问顶点着色器上的缓冲存储器?

时间:2014-09-16 11:55:41

标签: opengl-es vertex-shader opengl-es-3.0

我听说顶点着色器使用OpenGL 3.x访问用户自己的缓冲区数据(纹理缓冲区对象) (使用TexelFetch方法)

所以最近我试图在IOS7的OpenglES 3.0顶点着色器上应用TPB技术,但我无法使用TBO bcz OpenGLES 3.0无法提供它。

我的顶点着色器必须访问TBO并使用它的速度,位置和力等数据。

我想在OpenglES 3.0上使用similer TBO techinc。

如果我使用像素缓冲区对象,我可以使用" texelFetch()"来访问它们。着色器上的方法?

我如何计算我的工作? 有人知道一个好方法吗?

1 个答案:

答案 0 :(得分:0)

我不相信你可以直接从Pixel Buffer Object中采样。

一个明显的选择是使用常规纹理而不是纹理缓冲对象。 ES 3.0兼容iOS设备的最大纹理大小为4096(来源:https://developer.apple.com/library/iOS/documentation/DeviceInformation/Reference/iOSDeviceCompatibility/OpenGLESPlatforms/OpenGLESPlatforms.html)。根据数据的大小,有几个子案例。 n是纹素的数量:

  • 如果n最多为4096,则可以将其存储在尺寸为n x 1的2D纹理中。
  • 如果n超过4096,您可以将其存储在尺寸为4096 x ((n + 4095) / 4096)的2D纹理中。

在这两种情况下,您仍然可以使用texelFetch()从纹理中获取数据。在第一种情况下,您会对(i, 0)进行抽样以获得值i。在第二种情况下,您采样(i % 4096, i / 4096)

如果您已经在缓冲区中拥有数据,则可以通过在调用GL_PIXEL_UNPACK_BUFFER之前将缓冲区绑定为glTexImage2D()来存储纹理,然后从缓冲区中获取数据。

另一个需要考虑的选择是统一缓冲区对象。这允许您将缓冲区的内容绑定到统一块,然后可以访问着色器中的值。有关详细信息,请在glBindBuffer()目标中查找glBindBufferBase()glBindBufferRange()GL_UNIFORM_BUFFER。统一块的最大大小(以字节为单位)由GL_MAX_UNIFORM_BLOCK_SIZE给出,在iOS / A7设备上为16,384。