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?
Respuestas:
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:
Contras:
Uber-shader
Pros:
Contras:
fuente
Uber-shader
en 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#ifdef
s que se alternarán para varios materiales.