我听说顶点着色器使用OpenGL 3.x访问用户自己的缓冲区数据(纹理缓冲区对象) (使用TexelFetch方法)
所以最近我试图在IOS7的OpenglES 3.0顶点着色器上应用TPB技术,但我无法使用TBO bcz OpenGLES 3.0无法提供它。
我的顶点着色器必须访问TBO并使用它的速度,位置和力等数据。
我想在OpenglES 3.0上使用similer TBO techinc。
如果我使用像素缓冲区对象,我可以使用" texelFetch()"来访问它们。着色器上的方法?
我如何计算我的工作? 有人知道一个好方法吗?
答案 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。