Pregunta

Esto es algo que he estado buscando durante un tiempo, pero todavía tengo que encontrar información concreta o buenos ejemplos. Tengo, por ejemplo, un montón de objetos no conectados (tiras triangulares, por ejemplo). ¿Cuál es la forma eficiente de renderizarlos?

He oído hablar de poner varios objetos en un VBO para reducir las llamadas de openGL, pero no he visto un ejemplo adecuado de cómo hacerlo. También he visto publicaciones que contradicen esta idea. Así que en este momento, estoy mayormente confundido.

¿Fue útil?

Solución

Primero, probablemente deberías usar VBO todo el tiempo. Para objetos pequeños y grandes.

Entonces, el segundo problema es " ¿cómo combinar varios objetos separados en un objeto grande? " - para reducir la cantidad de llamadas OpenGL que deben realizarse. En general, los objetos que usan las mismas texturas, configuraciones de materiales y sombreadores se pueden combinar. P.ej. si tiene toneladas de cajas idénticas por ahí, podría tener sentido combinarlas en varias " pilas de cajas " ;.

Si un objeto es una lista de triángulos, la combinación es fácil: simplemente cree una gran lista de triángulos a partir de las listas de origen. Si un objeto es una tira triangular, entonces debe usar & Quot; triángulos degenerados & Quot; para unir las tiras (también es una optimización muy útil para un solo objeto, si no se puede representar como una sola tira).

A " triángulo degenerado " es un triángulo que tiene dos o tres índices de vértice idénticos. El hardware de gráficos puede reconocerlos y omitirlos muy rápido.

Entonces, si tiene, p. dos tiras con un triángulo cada una, para un total de seis vértices.

Los índices de triángulo originales de las tiras serían:

1) 0, 1, 2
2) 0, 1, 2

Ahora unes todos los vértices, así que terminas con 6 vértices.

1) 0, 1, 2 (unchanged)
2) 3, 4, 5

En este momento tiene una matriz de vértices, pero aún dos tiras separadas. Tiene que unirlos insertando triángulos degenerados:

1) 0, 1, 2, 2, 2, 3, 4, 5

(creo que lo anterior es correcto, pero no lo he verificado)

La idea es esta: con la tira anterior, la tarjeta gráfica dibujaría triángulos de estos vértices:

0, 1, 2
1, 2, 2 <- degenerate! won't be drawn
2, 2, 2 <- degenerate! won't be drawn
2, 2, 3 <- degenerate! won't be drawn
3, 4, 5

En el caso general, debe insertar dos o tres triángulos degenerados en función de la longitud de la tira original, para que el devanado del triángulo siga siendo correcto.

Otros consejos

Consulte glDrawElements () , es una buena manera de lograr lo que quieres. Tenga en cuenta que el rendimiento puede disminuir si sus datos cambian cada cuadro, ya que luego necesita actualizar las partes relevantes de los datos, lo que significa copiarlos en la memoria de la tarjeta gráfica. Para datos estáticos, esto es muy rápido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top