将值列表传递给片段着色器

我想将值列表发送到片段着色器中。它可能是一个很大的列表(长数千个项目)单精度浮点数。片段着色器需要对该列表进行随机访问,我想刷新每帧上CPU的值。

我在考虑我如何可以这样做选择:

  1. 作为数组类型的统一变量(“ uniform float x [10];”)。但是这里似乎有限制,在我的GPU上发送数百个值非常慢,而且当我想在运行时更改它时,我必须在着色器中硬编码上限。

  2. 正如高度1和我的列表的宽度的纹理,然后利用glCopyTexSubImage2D刷新数据。

  3. 其他方法?我最近还没有跟上GL规范的所有变化,也许还有其他专门为此目的设计的方法?


有只小跳蛙
浏览 470回答 3
3回答

白猪掌柜的

这听起来像是纹理缓冲区对象的一个很好的用例。这些没有太多做定期的纹理,基本上允许您在着色器访问一个缓冲对象的内存作为一个简单的线性阵列。它们类似于1D纹理,但不进行过滤,只能由整数索引访问,这听起来像您将其称为值列表时需要执行的操作。而且它们还支持比1D纹理更大的尺寸。要更新它,你可以再使用标准缓冲对象的方法(glBufferData,glMapBuffer,...)。但另一方面,我认为它们需要使用GL3 / DX10硬件,甚至已经成为OpenGL 3.1的核心。如果您的硬件/驱动程序不支持它,那么您的第二种解决方案将是选择的方法,而是使用1D纹理而不是宽度x 1 2D纹理)。在这种情况下,你也可以使用非平面2D纹理和一些指数魔比最大纹理尺寸的支持列表。但是,我认为纹理缓冲区是您问题的完美选择。为了获得更准确的了解,您还可以查看相应的扩展规范。编辑:为了回应Nicol关于统一缓冲区对象的评论,您还可以在此处查找两者的一些比较。我仍然倾向于使用TBO,但是不能真正地说明原因,仅是因为我认为它在概念上更合适。但是,也许尼克尔可以提供答案,使人们对该事件有更多的了解。
打开App,查看更多内容
随时随地看视频慕课网APP