¿Cuántos programas OpenGL debo usar para representar varios objetos?

10

Mi escena tiene múltiples objetos en ella. (Digamos 3 cubos, 1 cilindro, 8 esferas). Supongo que debería crear un sombreador de vértices para cada uno. ¿Cuántos programas debo tener?

Alternativas:

  • Un programa por objeto
  • Un programa para todos los cubos y otro para todas las esferas (suponiendo que usen los mismos sombreadores)
  • Un gran programa para todo

¿Cuál es el enfoque correcto?

Jacks_Gulch
fuente
1
"Supongo que debería crear un sombreador de vértices para cada uno". ¿Por qué estás asumiendo esto? Un sombreador de vértices transformará los vértices de acuerdo con su modelo y verá las matrices y casi siempre querrá que sea igual para todo.
usm

Respuestas:

8

Debería considerar los programas de sombreado como una parte del estado similar a las texturas. Cambiar el estado es costoso, por lo que puede evitar combinar varias texturas en una para evitar cambios de textura; Lo mismo se aplica a los sombreadores: puede combinar varios sombreadores para evitar cambios de estado.

De manera similar a la combinación de texturas, la combinación de sombreadores viene con una sobrecarga: si solo renderiza un área de 16x16 píxeles de una textura de 4096x4096, no está utilizando el hardware de manera eficiente. Del mismo modo, si el objeto que renderiza solo usa el 10% del código en su sombreador, es posible (e incluso probable) que la tarjeta gráfica esté calculando muchas cosas innecesariamente.

En resumen, "depende".

Jari Komppa
fuente
44
Además, en muchos casos puedes escapar con solo un sombreador. Las diferencias están sólo en los uniformes que pasan al sombreado, como, color, textura, mapas normales, etc
rioki
Sí, por ejemplo, puede tener un sombreador "Escamoso" que produce fragmentos que se ven escamosos, y que funciona de tal manera (la mayoría de los sombreadores lo hacen ...) que puede renderizar los 3 cubos, 1 cilindro y 8 esferas usando eso un sombreador (con las primitivas de geometría correspondientes, por supuesto). Un conjunto razonable de uniformes aquí podría ser un valor vectorial que define el color, y tal vez algunos escalares o algo que afecte cuán "escamoso" o "brillante" será el efecto visual. Luego tiene un sombreador y cambia la forma en que el sombreador colorea los fragmentos al cambiar los uniformes entre los dibujos de las geometrías individuales.
Steven Lu
5

Es mejor mantener las cosas lo más simples posible. Duplicar el mismo sombreador para cada objeto es innecesario y se hinchará rápidamente. Tampoco desea un sombreador gigante que cubra todos los casos de uso posibles, ya que esto causa una sobrecarga innecesaria.

Hay varias opiniones sobre la gestión de sombreadores y no hay una forma "óptima" de abordar esto. Incluso he visto algunas implementaciones de sombreadores en las que cada sombreador se genera sobre la marcha sobre la base de parámetros (por ejemplo, en el motor Unreal ).

Para alguien que recién comienza en esta área, puede ser bueno dibujar primero los sombreadores básicos. Por ejemplo, tengo un sombreador para objetos sin textura, un sombreador con textura básica y soporte de iluminación por píxel, etc. Entonces, cada vez que quiero un efecto diferente que no se puede hacer usando un sombreador anterior, entonces ' crearé uno nuevo para el nuevo efecto.

El propósito de tal sistema es mantener las cosas simples. Sólo. Mantener. Eso. Simple.

Anko
fuente
+1 porque mencionaste lo que está haciendo la industria actual.
Krythic