在OpenGL中使用index作为坐标

Ben*_*igt 5 opengl plot shader vbo opengl-3

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

我以前做过一些立即模式的opengl,但现在已经弃用了VBO.我可以找到的所有VBO示例都存储了每个点的XYZ坐标.

我怀疑我需要将所有数据保存在VRAM中以便在平移期间获得一个可以称为"平滑"的帧速率,但我只有Y数据(因变量).X是一个可以从索引计算的自变量,Z是常数.如果我必须存储X和Z,那么我的内存要求(缓冲区大小和CPU-> GPU块传输)都会增加三倍.我有数千万个用户可以通过其平移的数据点,因此内存使用量将是非常重要的.

是否有一些技术可用于绘制1-D顶点数组,其中索引用作另一个坐标,或存储1-D数组(可能在纹理中?)并使用着色器程序生成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);
Run Code Online (Sandbox Code Playgroud)

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

kva*_*ark 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 );
Run Code Online (Sandbox Code Playgroud)

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

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

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

#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);
}
Run Code Online (Sandbox Code Playgroud)

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

glBindAttribLocation(program_id,0,"at_coord_Y");
Run Code Online (Sandbox Code Playgroud)

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

const int attrib_pos = glGetAttribLocation(program_id,"at_coord_Y");
Run Code Online (Sandbox Code Playgroud)

祝你好运!