GLSL, ¿todo en uno o varios programas de sombreado?

17

Estoy haciendo algunas demostraciones en 3D usando OpenGL y noté que GLSL es algo "limitado" (¿o soy solo yo?). De todos modos tengo muchos tipos diferentes de materiales. Algunos materiales tienen color ambiental y difuso, algunos materiales tienen mapa de oclusión ambiental, algunos tienen mapa especular y mapa de relieve, etc.

¿Es mejor admitir todo en un par de sombreadores de vértices / fragmentos o es mejor crear muchos sombreadores de vértices / fragmentos y seleccionarlos según el material seleccionado actualmente? ¿Cuál es la estrategia de sombreado habitual en OpenGL o D3D?

stjepano
fuente
2
ver stackoverflow.com/questions/4649801/…
Patryk Czachurski el
Esta es una dicotomía falsa, que debe elegir uno u otro enfoque para administrar sombreadores. En quince años en la industria, nunca trabajé en un proyecto en el que nos adhiriéramos a ninguno de los extremos, pero siempre encontré un equilibrio entre los dos enfoques para administrar sombreadores, utilizando cada uno donde tenía sentido hacerlo.
Trevor Powell

Respuestas:

12

La respuesta es que depende un poco.

Básicamente hay dos escuelas de pensamiento; sombreadores pequeños y óptimos para todo y para el campamento de súper sombreadores.

Los sombreadores pequeños son solo eso; Haz una cosa y hazla bien. Los Uber-shaders controlan su funcionalidad en tiempo de ejecución a través de uniformes, o compilan en un montón de diferentes sombreadores a través de macros de preprocesador (y / o fuentes de sombreador generadas).

La solución óptima probablemente no sea ninguna, sino algún tipo de híbrido. Quizás algunos uber-shaders o uber-shaders combinados con shaders especializados en algunos casos.

Sombreador pequeño

Pros:

  • Probablemente sea más rápido / más óptimo
  • Hace exactamente lo que quieres que haga
  • Puede hacer cosas raras y personalizadas fácilmente

Contras:

  • Se sale de control fácilmente, especialmente cuando aumenta la cantidad de funciones
  • Probablemente más trabajo, a menos que tenga un número muy pequeño de sombreadores

Uber-shader

Pros:

  • Todo en un mismo lugar
  • Más amigable para el artista (usar la función A con la función X por primera vez no necesariamente requiere tiempo de codificador)

Contras:

  • Tiempos de compilación más largos del sombreador
  • Resultados menos óptimos (especialmente si se usan uniformes para activar / desactivar funciones)
  • Puede ser más difícil de depurar / optimizar
Jari Komppa
fuente
Uber-shaderen esta representación no es algo bueno :) Yo propondría escribir un buen administrador de sombreadores basado en predefinidos, por lo que tendremos un código uber-sombreador con muchos #ifdefs que se alternarán para varios materiales.
brigadir
2
Agregaría que otro profesional de un súper sombreador es que cambiar los sombreadores tiene un costo en términos de rendimiento, por lo que si cambia con menos frecuencia, puede mejorar el rendimiento.
Jherico