opengl - renderizar con gpu vray
OpenGL: forma eficiente de renderizar un lote de geometrĂa (2)
En primer lugar, probablemente debería 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 el número de llamadas OpenGL que deben realizarse. Generalmente, los objetos que usan la misma textura (s), configuraciones de materiales y sombreadores se pueden combinar. Por ejemplo, si tiene toneladas de cajas idénticas por ahí, podría tener sentido combinarlas en varias "cajas de cajas" más grandes.
Si un objeto es una lista de triángulos, entonces la combinación es fácil; solo crea una gran lista de triángulos de las listas de fuentes. Si un objeto es una tira de triángulo, entonces tienes que usar "triángulos degenerados" para unir las tiras (esta es una optimización muy útil para un solo objeto también, si no se puede representar como una sola tira).
Un "triángulo degenerado" es un triángulo que tiene dos o tres índices de vértices idénticos. El hardware de gráficos puede reconocerlos y omitirlos muy rápido.
Entonces, si tiene, por ejemplo, dos tiras con un triángulo cada una, para un total de seis vértices.
Los índices triangulares originales de las tiras serían:
1) 0, 1, 2
2) 0, 1, 2
Ahora unes todos los vértices, por lo que terminas con 6 vértices.
1) 0, 1, 2 (unchanged)
2) 3, 4, 5
Ahora tienes una matriz de vértices, pero todavía dos tiras separadas. Debes unirte a ellos insertando triángulos degenerados:
1) 0, 1, 2, 2, 2, 3, 4, 5
(Creo que lo anterior es correcto, pero en realidad no lo he verificado)
La idea es esta: con la tira anterior, la tarjeta gráfica dibujaría triángulos fuera 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 general, debe insertar dos o tres triángulos degenerados en función de la longitud de la tira original, de modo que el devanado triangular permanezca correcto.
Esto es algo que he estado buscando mientras, pero todavía tengo que encontrar información concreta o buenos ejemplos. Tengo, por ejemplo, un grupo de objetos no conectados (triángulos, por ejemplo). ¿Cuál es la forma eficiente de renderizar estos?
He oído acerca de poner varios objetos en un VBO para reducir las llamadas de OpenGL, pero no he visto un ejemplo adecuado de cómo hacer esto. También he visto publicaciones que contradicen esta idea. Así que ahora mismo, estoy confundido.
Mire en glDrawElements () , es una buena forma de lograr lo que quiere. Tenga en cuenta que el rendimiento puede disminuir si sus datos cambian cada fotograma, ya que luego debe 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.