2008-12-01 20 views
6

Estoy trabajando en un programa CAD simple que usa OpenGL para manejar el renderizado en pantalla. Cada forma dibujada en la pantalla está construida completamente con segmentos de línea simples, por lo que incluso un simple dibujo termina procesando miles de líneas individuales.¿Cuál es la forma más eficiente de administrar un gran conjunto de líneas en OpenGL?

¿Cuál es la mejor manera de comunicar los cambios en esta colección de líneas entre mi aplicación y OpenGL? ¿Hay alguna manera de actualizar solo un cierto subconjunto de líneas en los búferes de OpenGL?

Estoy buscando una respuesta conceptual aquí. No es necesario entrar en el código fuente real, solo algunas recomendaciones sobre la estructura de datos y la comunicación.

Respuesta

8

Se puede utilizar un enfoque simple como el uso de una lista de visualización (glNewList/glEndList)

La otra opción, que es un poco más complicada, es el uso de Vertex Buffer Objects (OISCIV - GL_ARB_vertex_buffer_object). Tienen la ventaja de que pueden cambiarse dinámicamente, mientras que una lista de visualización no.

Básicamente, todos estos lotes/transformaciones se procesan y se ejecutan en la GPU (suponiendo que esté utilizando la aceleración de hardware), lo que da como resultado un mayor rendimiento.

7

Vertex Buffer Objetos son probablemente lo que usted desea. Una vez que cargue el conjunto de datos original, puede hacer modificaciones a los fragmentos existentes con glBufferSubData().

Si agrega segmentos de línea adicionales y desborda el tamaño de su búfer, tendrá que crear un nuevo búfer, pero esto no es diferente de tener que asignar un nuevo trozo de memoria más grande en C cuando algo crece .

EDIT: Un par de notas en las listas de visualización, y por qué no usarlos:

  1. En OpenGL 3.0, las listas de visualización están en desuso, por lo que su uso no es compatible hacia adelante últimos 3.0 (2.1 implementaciones estará disponible por un tiempo, por lo tanto, dependiendo de su público objetivo, esto podría no ser un problema)
  2. Cada vez que cambie algo, debe reconstruir toda la lista de visualización, lo que frustra el propósito completo de las listas de visualización si las cosas se cambian a menudo
2

No estoy seguro de si ya está haciendo esto, pero vale la pena mencionar que se debe tratar de usar en lugar de GL_LINE_STRIP GL_LINES individuales si es posible reducir la cantidad de datos de los vértices de ser enviado a la tarjeta.

+0

¡Gracias por la sugerencia! –

2

Mi sugerencia es intentar usar un gráfico de escena, algún tipo de estructura de datos jerárquica para las líneas/curvas. Si tiene modelos enormes, el rendimiento se verá afectado si tiene una lista simple de líneas. Con una estructura de gráfico/árbol puede verificar fácilmente qué elementos son visibles y cuáles no mediante el uso de volúmenes delimitadores. También con un scenegraph puedes aplicar transformación fácilmente y reutilizar geometrías.

Cuestiones relacionadas