OpenGL - 向纹理添加新数据

时间:2016-11-24 20:32:39

标签: c++ opengl

我正努力创造一个有趣的视谱。目前,我正在使用纹理缓冲区在CPU上执行所有操作,方法是循环遍历整个纹理缓冲区并将新数据推送到“队列”。但是,这花费了我很多CPU时间。我想在纹理中添加新的像素数据列,将旧数据向右移动,因此新数据显示在左侧,而旧数据则向右移动。如果我每帧都这样做,这将创建瀑布/侧面滚动效果。

我正在使用glTexSubImage2D()添加新数据,但这不会将旧数据推进到正确的位置。如何通过使用OpenGL实现这一目标?

3 个答案:

答案 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执行的。