En Direct3D, los sombreadores multipass son fáciles de usar porque literalmente puede definir pases dentro de un programa. En OpenGL, parece un poco más complejo porque es posible darle a un programa de sombreado tantos sombreadores de vértices, geometrías y fragmentos como desee.
Un ejemplo popular de un sombreador multipass es un sombreador de toon. Un pase realiza el efecto de sombreado de celdas real y el otro crea el contorno. Si tengo dos sombreadores de vértice, "cel.vert" y "outline.vert", y dos sombreadores de fragmentos, "cel.frag" y "outline.frag" (de forma similar a como lo hace en HLSL), ¿cómo puedo combinarlos para crear el sombreador de toon completo?
No quiero que digas que se puede usar un sombreador de geometría para esto porque solo quiero conocer la teoría detrás de los sombreadores GLSL multipass;)
Respuestas:
No hay "teoría" detrás de multipass. No hay "sombreadores multipass". Multipass es muy simple: dibuja el objeto con un programa. Luego dibujas el objeto con un programa diferente .
Puede usar cosas D3DX como archivos FX para ocultar estos pases adicionales. Pero todavía funcionan de esa manera. OpenGL simplemente no tiene un escondite para ello.
fuente
Renderice el objeto con el sombreador de celdas y luego vuelva a renderizarlo con el sombreador de contorno.
fuente
En OpenGL 4.0 hay subrutinas uniformes . Estos le permiten definir funciones que se pueden intercambiar en tiempo de ejecución con muy poca sobrecarga. Entonces puedes hacer 1 función para cada pase. También 1 función para cada tipo de sombreador.
Hay un tutorial aquí .
Para versiones anteriores de OpenGL, su mejor opción es tener un montón de sombreadores diferentes e intercambiar entre ellos. De lo contrario, puede sumar valores que multiplique por un uniforme que sea 0.0 o 1.0 para activarlo o desactivarlo. De lo contrario, se pueden usar condicionales si se pueden usar declaraciones, pero OpenGL ejecutará todos los resultados posibles en cada ejecución / pase, así que asegúrese de que no sean demasiado pesados.
fuente
Hay algunas personas que saben mucho acerca de GLSL, así que espero que aclaren las cosas, pero en base a lo que he visto, en tu sombreador de fragmentos, deberías poder hacer algo como esto (pseudocódigo, I Dejaré el GLSL real a las personas que lo conocen mejor):
Al usar
if
s de esta manera, obtienes algo así como múltiples pases. ¿Tiene sentido?Editar: Además, espero que esta pregunta sobre SO ayude a disipar algunos malentendidos.
fuente