5

我想实现一个允许用户缩放和平滑平移的时间序列查看器。

我以前做过一些即时模式opengl,但现在不赞成使用VBO。我能找到的所有 VBO 示例都存储了每个点的 XYZ 坐标。

我怀疑我需要将所有数据保存在 VRAM 中,以便在平移期间获得可以称为“平滑”的帧速率,但我只有 Y 数据(因变量)。X 是一个自变量,可以从指数中计算出来,Z 是常数。如果我必须存储 X 和 Z,那么我的内存需求(缓冲区大小和 CPU->GPU 块传输)将增加三倍。而且我有数以千万计的数据点,用户可以通过这些数据点进行平移,因此内存使用量将不小。

是否有一些技术可以绘制一维顶点数组,其中索引用作另一个坐标,或者存储一维数组(可能在纹理中?)并使用着色器程序生成 XYZ?我的印象是在新的无固定特征管道模型下无论如何我都需要一个简单的着色器来实现缩放和平移,所以如果我可以结合 X 和 Z 坐标的生成以及 Y 的缩放/平移,那将是理想的。

这甚至可能吗?您知道执行此操作的任何示例代码吗?或者你至少能给我一些伪代码,说明以什么顺序调用哪些 GL 函数?

谢谢!

编辑:为了确保这一点很清楚,这是等效的立即模式代码和顶点数组代码:

// immediate
glBegin(GL_LINE_STRIP);
for( int i = 0; i < N; ++i )
    glVertex2(i, y[i]);
glEnd();

// vertex array
struct { float x, y; } v[N];
for( int i = 0; i < N; ++i ) {
    v[i].x = i;
    v[i].y = y[i];
}
glVertexPointer(2, GL_FLOAT, 0, v);
glDrawArrays(GL_LINE_STRIP, 0, N);

请注意,v[]它的大小是 的两倍y[]

4

2 回答 2

4

这对 OpenGL 来说非常好。

顶点缓冲区对象 (VBO) 可以以 GL 支持的格式之一存储您想要的任何信息。您可以只用一个坐标填充 VBO:

glGenBuffers( 1, &buf_id);
glBindBuffer( GL_ARRAY_BUFFER, buf_id );
glBufferData( GL_ARRAY_BUFFER, N*sizeof(float), data_ptr, GL_STATIC_DRAW );

然后为绘制绑定正确的顶点属性格式:

glBindBuffer( GL_ARRAY_BUFFER, buf_id );
glEnableVertexAttribArray(0);  // hard-coded here for the sake of example
glVertexAttribPointer(0, 1, GL_FLOAT, false, 0, NULL);

为了使用它,您需要一个简单的着色器程序。顶点着色器可能如下所示:

#version 130
in float at_coord_Y;

void main() {
    float coord_X = float(gl_VertexID);
    gl_Position = vec4(coord_X,at_coord_Y,0.0,1.0);
}

在链接着色器程序之前,您应该将它的 at_coord_Y 绑定到您将使用的属性索引(在我的代码中为 =0):

glBindAttribLocation(program_id,0,"at_coord_Y");

或者,您可以在链接后询问程序自动分配此属性的索引,然后使用它:

const int attrib_pos = glGetAttribLocation(program_id,"at_coord_Y");

祝你好运!

于 2011-02-09T21:05:30.490 回答
0

你会在 VRAM 中存储一千万个 XY 坐标吗?

我建议您在 CPU 上计算这些坐标,并将它们作为制服传递给着色器管道(因为坐标固定到平移图像)。

把事情简单化。

于 2011-02-09T20:24:34.383 回答