Quiero implementar un visor de series temporales que permite al usuario acercar y alternar sin problemas.Usar índice como coordenada en OpenGL
He hecho algunos opengl de modo inmediato antes, pero eso ahora está en desuso en favor de VBO. Todos los ejemplos de VBOs que puedo encontrar almacenan las coordenadas XYZ de cada uno de los puntos.
Sospecho que necesito conservar todos mis datos en VRAM para obtener una tasa de cuadros por segundo durante el pan que se puede llamar "suave", pero solo tengo datos Y (la variable dependiente). X es una variable independiente que puede calcularse a partir del índice, y Z es constante. Si tengo que almacenar X y Z, mis requisitos de memoria (tanto el tamaño del buffer como la CPU-> GPU bloquean la transferencia) se triplican. Y tengo decenas de millones de puntos de datos a través de los cuales el usuario puede desplazarse, por lo que el uso de la memoria no será trivial.
¿Hay alguna técnica para dibujar una matriz de vértice 1-D, donde se usa el índice como la otra coordenada, o almacenar una matriz 1-D (probablemente en una textura?) Y usar un programa de sombreado para generar la XYZ? Tengo la impresión de que necesito un sombreador simple de todos modos con el nuevo modelo de canalización de características fijas para implementar escalado y traducción, así que si pudiera combinar la generación de coordenadas X y Z y la escala/traducción de Y que sería ideal.
¿Esto es posible? ¿Conoces algún código de muestra que haga esto? ¿O puede al menos darme un pseudocódigo que diga a qué funciones GL llamar en qué orden?
Gracias!
EDIT: Para asegurarse de que esto está claro, aquí está el código en modo inmediato equivalente, y el código de serie de vértices:
// 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);
nota que v[]
es dos veces el tamaño de y[]
.
Gracias. Supongo que no estoy seguro de cómo OpenGL sabe que quiero que 'coord_X' signifique el índice del vértice. –
@Ben Voigt: me lo perdí inicialmente, lo siento :) La respuesta está arreglada ahora (usando gl_VertexID). – kvark
Gracias, eso tiene mucho más sentido ahora. Y podría usar 'glDrawArrays' para renderizar este en masa? Lo estoy preguntando porque [la página de manual para 'glDrawArrays'] (http://www.opengl.org/sdk/docs/man/xhtml/glDrawArrays.xml) dice" Si GL_VERTEX_ARRAY no está habilitado, no se generan primitivas geométricas. " ¿Eso no se aplica en el mundo de OpenGL 3 donde el shader genera ubicaciones de vértices? –