2011-07-06 13 views
10

Estoy renderizando algunas mallas (a veces más de 500) y quería saber la mejor manera de abordar esto. ¿Sería inútil crear 500 VBO y luego, si pasan las pruebas de frustum y visibilidad, renderizarlas? ¿Hay una manera más eficiente de hacer esto? Estoy buscando maximizar el rendimiento.OpenGL: ¿usará la renderización lenta de VBO múltiple?

Respuesta

11

Para responder a su pregunta, sí, muchos VBO reducirán la velocidad. Más polys por lo general ralentizarán el render, pero más draw calls tiene un impacto mucho mayor. Desea minimizar los cambios de estado y los sorteos, así como la cantidad de búferes que tiene (y el uso de memoria).

Sugeriría primero mirar los almacenamientos intermedios y averiguar cuántos usted necesita. Si puede aplicar lotes/geometría de instancia, combine la geometría estática en un solo búfer, reutilice el búfer de manera más eficiente, etc.

Una vez que haya reducido los búferes al mínimo posible, querrá utilizar la eliminación selectiva de varios géneros . La visibilidad, tanto por el fucsum (quizás en un octárbol) como por la oclusión, puede proporcionar un importante aumento del rendimiento. La idea principal es descalificar la geometría de la manera más rápida y sencilla posible, por lo que debe comenzar con pruebas aproximadas (octree), luego algo más detallada (tal vez una AABB y/o casco simplificado), luego oclusión, y luego dibujar.

Aquí hay un good article on frustrum culling, que toca un poco en quadtrees (y, por extensión, octrees). Diagramas, explicaciones y algunos ejemplos de código.

Los artículos de eliminación de oclusiones OpenGL parecen un poco menos comunes, aunque this one from GPU Gems podría ser un buen lugar para comenzar.

+1

Gracias por la respuesta. Estoy descartando el uso de un árbol binario y funciona bien. Estaba más preocupado con el hecho de que tener 500 buffers derrotaría la esencia de las ganancias de velocidad asociadas con las VBO. –

+1

Para que no se equivoque: el uso de varias VBO _en general_ es ventajoso (algunas docenas a la vez), porque permite que la GPU extraiga de una mientras carga otra, y mueve datos entre la memoria GPU y la memoria principal (que el conductor a veces tiene que hacer) también será más eficiente, ya que actualizará los datos. Simplemente, como señaló Peachykeen, tener cientos de ellos significa cambiar de estado cientos de veces, lo que finalmente es perjudicial. – Damon

+2

Sí, los VBO son buenos (nunca se debe enviar geometría en todos los fotogramas si hay una forma de evitarlos), pero tener demasiados búferes puede causar errores de memoria y dañar el rendimiento de manera significativa. No estoy seguro de si 500 es * demasiados *, pero está presionando lo suficiente como para intentar reducirlo. – ssube

Cuestiones relacionadas