将这些值写入纹理以供使用的最有效方法(ogl 函数)是什么?
一个好方法是尽量避免任何不必要的额外副本。因此,您可以使用映射到地址空间的像素缓冲区对象,并使用它直接将数据生成到其中。
由于您希望每帧更新此数据,因此您还希望寻找有效的缓冲区对象流,这样您就不会强制 CPU 和 GPU 之间的隐式同步。在您的场景中执行此操作的一种简单方法是使用 3 个 PBO 的环形缓冲区,您每帧都将其推进。
其他地方建议的东西,我认为我不想使用(如果我弄错了,请告诉我):
- glDrawPixels() - 我的印象是每次调用它都会导致中断,这会使其变慢,尤其是在高分辨率下。
好吧,驱动程序所做的完全是特定于实现的。我不认为“每次都造成中断”在这里是有用的心理形象。您似乎完全低估了 GL 实施将在您背后做的工作。GL 调用不会对应于发送到 GPU 的某些命令。
但不使用glDrawPixels
仍然是一个不错的选择。它不是很有效,并且已被弃用并从现代 GL 中删除。
- 使用着色器 - 我不认为着色器可以接受和处理每帧数组中的数据量(在别处提到他们可能接受的数据量上限太低)
你完全错了。没有办法不使用着色器。如果您不是自己编写的(例如,通过使用 GL 的旧“固定功能管道”),GPU 驱动程序将为您提供着色器。这些早期固定功能阶段的硬件实现已经完全被可编程单元取代——所以如果你不能用着色器来做,你就不能用 GPU 来做。而且我强烈建议您编写自己的着色器(无论如何,它是现代 GL 中的唯一选择)。