gpt4 book ai didi

c++ - 在 OpenGL 中快速画线

转载 作者:可可西里 更新时间:2023-11-01 16:21:17 25 4
gpt4 key购买 nike

我正在从事一个项目,该项目需要绘制大量数据,因为它是由 ADC 获取的……在 1600 像素宽的监视器上每帧大约 50,000 行。它在配备 2007-ish Quadro FX 570 的系统上运行良好,但基本上跟不上配备 Intel HD 4000 级芯片的机器上的数据。数据负载是 32 channel 的 200 Hz 数据,每批接收 5 个样本,每 channel 每秒 40 次。因此,换句话说,该卡只需要达到每秒 40 帧或更高。

我为所有 32 个 channel 使用一个 VBO,每个 channel 有 10,000 个顶点的空间。 VBO 本质上被视为每个 channel 的一系列环形缓冲区。当数据进来时,我会根据所使用的时间尺度对其进行抽取。所以,基本上,它跟踪每个 channel 的最小值/最大值。当为单个像素列接收到足够的数据时,它会在 VBO 中为每个 channel 设置接下来的两个顶点并渲染一个新帧。

我使用 glMapBuffer() 一次访问数据,更新所有 channel ,使用 glUnmapBuffer,然后根据需要进行渲染。

我提前手动计算变换矩阵(使用以非通用方式计算的正交变换以减少乘法),顶点着色器看起来像:

#version 120

varying vec4 _outColor;

uniform vec4 _lBound=vec4(-1.0);
uniform vec4 _uBound=vec4(1.0);
uniform mat4 _xform=mat4(1.0);

attribute vec2 _inPos;
attribute vec4 _inColor;

void main()
{
gl_Position=clamp(_xform*vec4(_inPos, 0.0, 1.0), _lBound, _uBound);
_outColor=_inColor;
}

_lBound_uBound_xform 制服每个 channel 更新一次。因此,每帧 32 次。钳位用于将某些 channel 限制在屏幕上的 y 坐标范围内。

片段着色器很简单:

#version 120

varying vec4 _outColor;

void main()
{
gl_FragColor=_outColor;
}

还有其他东西被渲染到屏幕上; channel 标签,例如,使用四边形和纹理图集;但是 gDEBugger 中的分析似乎表明线渲染每帧花费了绝大多数时间。

不过,50,000 行对我来说并不是一个大得吓人的数字。

所以,在所有这些之后,问题是:是否有任何加快线条绘制的技巧?我尝试将它们渲染到模板缓冲区,然后裁剪一个四边形,但速度较慢。我考虑过将线条绘制到纹理上,用纹理绘制四边形。但是,由于不断上传大纹理,这似乎无法扩展甚至更快。我看到了一种将 y 值存储在单行纹理中的技术,但这似乎更像是内存优化而不是速度优化。

最佳答案

映射 VBO 可能会降低速度,因为驱动程序可能需要将 GPU 与 CPU 同步。一种更高效的方法是将您的数据扔到 GPU 上,这样 CPU 和 GPU 就可以更独立地运行。

  • 每次都重新创建 VBO,使用 STATIC_DRAW 创建它
  • 如果您需要映射数据,请不要将其映射为可读 (GL_WRITE_ONLY)

关于c++ - 在 OpenGL 中快速画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22722161/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com