我试图有效地创建一个频谱图。当前,我通过循环整个纹理缓冲区并将新数据推送到“队列”,使用纹理缓冲区在CPU上进行所有操作。但是,这花费了我很多CPU时间。我想将新一列的像素数据添加到纹理中,将旧数据移至右侧,因此新数据显示在左侧,而旧数据移至右侧。如果我每帧都这样做,将会创建瀑布/侧滚动效果。

我正在使用glTexSubImage2D()添加新数据,但这不会将旧数据移至右侧。如何使用OpenGL实现此目标?

最佳答案

我认为不需要移动任何数据。只需将纹理在水平方向上视为圆形即可,基本上是圆柱的圆形缓冲区。然后通过相应选择纹理坐标来避免渲染期间的滚动。

假设您要一次显示n列。创建宽度为n的纹理,并在每个步骤k中将数据存储在纹理的列k % n中:

glTexSubImage(GL_TEXTURE_2D, 0, k % n, 0, 1, height, ...);


然后在水平方向上使用1 + (k % n) / n(k % n) / n范围内的纹理坐标,并将纹理环绕模式设置为GL_REPEAT。或将偏移量传递给着色器,然后将其添加到GLSL代码中的纹理坐标中。

当然,如果您提前拥有所有数据,并且它不是很大,则可以简单地从一开始就将所有数据存储在纹理中,并通过移动纹理坐标来滚动浏览。

关于c++ - OpenGL-向纹理添加新数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40794142/

10-15 06:15