为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

猛跑小猪 2019-12-10 10:37:59
我想将值列表发送到片段着色器中。它可能是一个很大的列表(长数千个项目)单精度浮点数。片段着色器需要对该列表进行随机访问,我想刷新每帧上CPU的值。我正在考虑如何做到这一点的选择:作为数组类型的统一变量(“ uniform float x [10];”)。但是这里似乎有限制,在我的GPU上发送数百个值非常慢,而且当我想在运行时更改它时,我必须在着色器中硬编码上限。作为高度为1且宽度为列表的纹理,然后使用glCopyTexSubImage2D刷新数据。其他方法?我最近还没有跟上GL规范的所有变化,也许还有其他专门为此目的设计的方法?
查看完整描述

3 回答

?
慕容708150

TA贡献1831条经验 获得超4个赞

这听起来像是纹理缓冲区对象的一个很好的用例。这些与常规纹理没有太大关系,基本上可以让您以简单的线性数组的形式在着色器中访问缓冲区对象的内存。它们类似于1D纹理,但不进行过滤,只能由整数索引访问,这听起来像您将其称为值列表时需要执行的操作。而且它们还支持比1D纹理更大的尺寸。要更新它,你可以再使用标准缓冲对象的方法(glBufferData,glMapBuffer,...)。


但另一方面,我认为它们需要使用GL3 / DX10硬件,甚至已经成为OpenGL 3.1的核心。如果您的硬件/驱动程序不支持它,那么您的第二种解决方案将是选择的方法,而是使用1D纹理而不是宽度x 1 2D纹理)。在这种情况下,您还可以使用非平面2D纹理和一些索引魔术来支持大于最大纹理大小的列表。


但是,我认为纹理缓冲区是您问题的完美选择。为了获得更准确的了解,您还可以查看相应的扩展规范。


编辑:为了回应Nicol关于统一缓冲区对象的评论,您还可以在此处查找两者的一些比较。我仍然倾向于使用TBO,但是不能真正地说明原因,仅是因为我认为它在概念上更合适。但是,也许尼克尔可以提供答案,使人们对该事件有更多的了解。


查看完整回答
反对 回复 2019-12-10
  • 3 回答
  • 0 关注
  • 518 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信