繁体   English   中英

OpenGL-向纹理添加新数据

[英]OpenGL - Adding new data to texture

我试图有效地创建一个频谱图。 当前,我通过循环整个纹理缓冲区并将新数据推送到“队列”来使用纹理缓冲区在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代码中的纹理坐标。

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

如果按照您说的方式执行此操作,则将很昂贵。 您将需要将纹理中的数据复制回cpu(或在cpu上保留一个副本),然后将数据添加到其中,然后使用glTexSubImage2D整个新图像再次复制回。

如果您已经知道所有数据,则可以将其全部放入纹理中,然后将纹理缓慢向右移动。 如果需要,您可以制作一个黑色正方形以覆盖您不希望看到的部分纹理。

您也可以在两者之间创建多个纹理,每次获取足够的数据时都创建一个新纹理,然后连续移动它们。

它可以由片段着色器(或像素着色器)完成。此着色器由系统的GPU执行。可用的着色语言不同。一种是nVidia(cg Shader),另一种是GLSL或HLSL。微软。 使用着色器是可能的(它们用于这种目的)。 而且绝对可以减少您的CPU时间,因为它由GPU执行。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM