在OpenGL中使用index作为坐标

时间:2011-02-09 17:39:36

标签: opengl shader plot vbo opengl-3

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

我以前做过一些立即模式的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[]的两倍。

2 个答案:

答案 0 :(得分: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");
祝你好运!

答案 1 :(得分:0)

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

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

保持简单。