Hola a todos! Mi nombre es Grigory Dyadichenko, y soy el fundador y director de tecnología de Foxsys Studios. Hoy quiero hablar sobre sombreadores. La capacidad de escribir sombreadores (y generalmente trabajar con renderizado) es muy importante cuando se desarrolla para plataformas móviles o AR / VR, si desea obtener gráficos geniales. Muchos desarrolladores piensan que los sombreadores son mágicos. Que hay poca información buena sobre ellos, y que para escribirlos es necesario tener, como mínimo, el título de candidato de la ciencia. Sí, el desarrollo de sombreadores por sus principios es muy diferente del desarrollo del cliente. Pero lo principal es comprender los principios básicos de los sombreadores, así como conocer su esencia, para que no haya nada mágico y la búsqueda de información sobre este tema fue una tarea simple. Esta serie de artículos está destinada a principiantes, por lo que si eres bueno programando sombreadores, esta serie no será interesante para ti. Cualquiera que quiera entender este tema, ¡bienvenido debajo del corte!

Este es un artículo introductorio en el que describiré los principios generales de la escritura de sombreadores. Si el tema es interesante, lo analizaremos con más detalle en artículos separados: sombreadores de vértices, sombreadores geométricos, sombreadores de fragmentos / píxeles, sombreadores triplanar, efectos de espacio de pantalla y sombreadores de computadora (OpenCL, CUDA, etc.). Y en general, toda la magia que se puede hacer en la GPU. Esto se resolverá en el contexto de la canalización estándar de Unity. Entonces, LWRP y HDRP hasta ahora me parecen un poco húmedos.
¿Qué es un sombreador?
Fuente: www.shadertoy.com/view/MsGSRdDe hecho, este es un programa que se ejecuta en la GPU, cuyo resultado es información diferente. En los sombreadores de vértices, estos son los parámetros de los vértices de la malla. Los sombreadores de píxeles se ejecutan píxel por píxel.
Para comprender cómo funcionan los sombreadores, debe saber qué es una tubería gráfica. Muy a menudo la gente habla sobre este tema en palabras bastante complicadas, pero haremos que sea un poco más fácil de entender. Tome el ejemplo de OpenGL. En este sentido, me gusta mucho esta foto.

Si omite partes relacionadas con la iluminación, etc. En general, desde el punto de escribir los mismos sombreadores Unlit en hlsl, la esencia es la siguiente. Tenemos un sombreador
#pragma vertex vert #pragma fragment frag
donde determinamos que la parte del vértice del sombreador se escribirá en la función vert y la parte del fragmento en la función frag.
Las estructuras que describimos en el sombreador determinan qué datos tomaremos de la malla y después de procesar con el sombreador de vértices que cuelgan de nuestros objetos MeshRenderer y MeshFilter.
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; };
A continuación, el sombreador de vértices se calcula al recibir los datos de los datos de la aplicación como entrada y da el resultado en forma de una estructura v2f, que luego va al sombreador de fragmentos. Lo que a su vez ya calculará el color del píxel. Dado que la información v2f se escribe solo en los vértices (que son más pequeños que los píxeles), los datos en la parte del fragmento se interpolan. Todo esto se puede representar como el hecho de que vert se considera en cada vértice de forma independiente. Luego, el resultado se transfiere a la parte del fragmento, donde el fragmento para cada píxel se considera independiente. Como los cálculos se llevan a cabo en paralelo, en estas partes no hay información sobre los vecinos (si no se transmite de manera inteligente).
Con más detalle, todos los matices, así como muchos ejemplos, se describen en la documentación de Unity
docs.unity3d.com/Manual/SL-Reference.htmlLenguajes de programación de sombreadores
Fuente: www.shadertoy.com/view/WsS3DcQué más es importante no olvidar. El hecho de que los sombreadores ahora están escritos en tres lenguajes de programación que no tienen nada que ver con la unidad. CG, GLSL y HLSL. La forma más fácil de escribir sombreadores en una unidad es a través de HLSL, ya que es donde se escriben los archivos de sombreadores con permiso .shader. Y si hay relativamente poca información sobre sombreadores en el contexto de una unidad, entonces la información por separado sobre HLSL, GLSL y CG es solo toneladas. La documentación de los sombreadores describe cómo transferir lo que está escrito en estos idiomas a Unity. Por lo tanto, resulta que casi toda la información en general sobre estos lenguajes de programación es válida. Los tres lenguajes son muy similares a C, pero cada uno tiene sus propias características.
Además, desde el punto de vista del estudio de los sombreadores, cuando estos idiomas ya no plantean preguntas, puede ver qué oportunidades "UnityCG.cginc" y otras bibliotecas escritas por la unidad ofrecen en sí mismas para simplificar su trabajo.
¿Por qué si en shaders es malo?
Fuente: www.shadertoy.com/view/Md3cWrEs importante comprender cómo se ejecutan los sombreadores a nivel de hierro y por qué son tan rápidos que pueden realizar millones de operaciones sin esfuerzo.
La idea principal de las GPU es el paralelismo máximo de los cálculos. Aquí es necesario introducir un concepto como "frente de onda". De hecho, es bastante simple, el frente de onda es un grupo de sombreadores que realiza la misma secuencia de operaciones. Es decir, desde el punto de vista de la GPU, la mejor opción es cuando se ejecutan las mismas instrucciones al mismo tiempo. La única diferencia en la ejecución es la entrada. El problema de la ramificación es que puede ocurrir una situación cuando en un solo grupo de sombreadores, los sombreadores deben invocar diferentes operaciones. Lo que a su vez conduce a la creación de un nuevo frente de onda, copiando datos en él, etc. Y es muy costoso.
Hay matices y excepciones, pero para escribir con seguridad si, debe comprender cómo se comporta en la versión de destino de la API gráfica. Dado que el mismo OpenGL ES 2 o DX11 a este respecto son muy diferentes.
¿Por qué necesito saber esto, porque hay editores de nodos?

Es importante comprender que los editores de nodos son principalmente una herramienta para artistas técnicos. Estos son especialistas que tienen experiencia en matemáticas, pero son más diseñadores. Los sombreadores del tipo de estructura alámbrica (donde se requiere la comprensión de las coordenadas barcéntricas) o la transformación a coordenadas cartesianas, que se utiliza para proyecciones difíciles, es mucho más fácil de hacer con el código, como muchos modelos matemáticos de materiales físicos. Al mismo tiempo, desde el punto de vista de un programador de sombreadores, esencialmente crea nodos y herramientas personalizadas para que los artistas técnicos creen magia real. Los editores de nodos tienen una funcionalidad limitada desde este punto de vista. Por lo tanto, es importante poder escribir sombreadores en idiomas como hlsl. Comprenda cómo funciona el renderizado, etc.
Recursos útiles para aprender
Fuente: www.shadertoy.com/view/4tlcWjEn términos de aprendizaje de programación de sombreadores, un buen ejercicio es reescribir sombreadores desde
www.shadertoy.com o
glslsandbox.com . Además, hay un perfil genial de un especialista de Unity, donde puedes ver muchos
github.com/keijiro interesantes
Todo lo demás es matemática y una comprensión de la física de los efectos. Esto es algo similar a mezclar los ingredientes, si el problema específico del modelado físico no se resuelve. Se pueden hacer muchas cosas interesantes mezclando ruido, refracción, dispersión de luz debajo de la superficie, cáusticos, efecto Fresnel, reacción de difusión y otras propiedades físicas de los objetos. En general, la programación del sombreador ciertamente no es elemental, y hay dónde cavar en profundidad.
Si el tema de los sombreadores es interesante, intentaré publicar una serie de artículos sobre este tema, que ya contengan ejemplos específicos y tutoriales sobre el tema de crear diferentes efectos. Sugiera en los comentarios lo que le interesaría leer y qué temas estudiar. Gracias por su atencion!
Todos los efectos en el artículo son una grabación de efectos de sombreado con sombreador de sombras.