我正努力创造一个有趣的视谱。目前,我正在使用纹理缓冲区在CPU上执行所有操作,方法是循环遍历整个纹理缓冲区并将新数据推送到“队列”。但是,这花费了我很多CPU时间。我想在纹理中添加新的像素数据列,将旧数据向右移动,因此新数据显示在左侧,而旧数据则向右移动。如果我每帧都这样做,这将创建瀑布/侧面滚动效果。
我正在使用glTexSubImage2D()
添加新数据,但这不会将旧数据推进到正确的位置。如何通过使用OpenGL实现这一目标?
答案 0 :(得分:2)
我认为不需要移动任何数据。简单地将纹理视为水平方向的圆形,基本上是圆形的圆形缓冲区。然后通过相应地选择纹理坐标,在渲染过程中对滚动进行恐慌。
假设您希望一次显示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代码中的纹理坐标中。
当然,如果你提前获得了所有数据,并且它不是很大,你可以直接从开始就将所有数据存储在纹理中,并通过移动纹理坐标来滚动它。
答案 1 :(得分:1)
如果你按照你想要的方式这样做,那将是昂贵的。您需要将纹理中的数据复制回cpu(或在cpu上保留副本),然后将数据添加到其中,然后使用glTexSubImage2D
复制整个新形象又回来了。
另一种方法是,如果您已经知道所有数据都将其全部放在纹理中,则将纹理缓慢移动到右侧。如果你需要,你可以制作一个黑色方块来覆盖你不想看到的纹理部分。
您也可以介入并创建多个纹理,每次获得足够的数据时都会创建一个新纹理,然后连续移动它们。
答案 2 :(得分:0)
它可以通过片段着色器(或像素着色器)完成。此着色器由系统的GPU执行。有不同的着色语言可供使用。来自nVidia(cg Shader),其他是GLSL或HLSL由微软提供。使用着色器是可能的(它们用于此类目的)。 毫无疑问,你的CPU时间会减少,因为它是由GPU执行的。