Escribir al frente
Han pasado tres años desde que Unity ha estado estudiando y trabajando. Lo primero que encuentro en el desarrollo es la búsqueda de Baidu. Nunca he tenido mis propias ideas, y me da vergüenza. Pensando que ya no puedo estar tan confundido, también decidí abrir un blog para registrar lo que encontré útil en el desarrollo. Espero que algún día en el futuro, no sienta que mi vida es en vano. Si puede ayudar a algunos estudiantes necesitados, entonces no podría ser mejor.
Sobre Shader
Hablando de eso, también está muy relacionado con Shader, porque me he enseñado C # antes, y mi primer trabajo es el desarrollo del backend del sitio web. Desde que aprendí Unity, he estado familiarizado con el camino y no es difícil. Al hojear algunos artículos, me di cuenta de que solo sé un poco, pero creo que la entrevista no debería ser un gran problema. Justo la noche antes de la entrevista, vi algunas preguntas de la entrevista y me di cuenta de la existencia de Shader. Como resultado, el La entrevista del día siguiente resultó estar relacionada con Shader. El primer artículo del blog está relacionado con Shader, probablemente para volver a la intención original, después de todo, la primera vez que ese año se plantó en él.
Respecto a este sombreador, tengo que hablar del blogger candycat . Después de trabajar, encontré problemas de sombreado, que eran básicamente imposibles de resolver personalmente. La persona que me llevó me recomendó este blogger. En ese momento, ni siquiera me molesté en iniciar sesión con una cuenta de CSDN, así que aprendí sobre el sombreador mirando sus artículos uno por uno. Durante el período, también compré los libros de sombreadores que ella publicó, pero no he ' Aún no he terminado de leerlo, así que estoy muy avergonzado. Después de aprender hasta ahora, aunque no puedo entender el sombreador, al menos leer el código del sombreador y escribir algunos efectos de sombreado simples no es un gran problema. Hablando de Candycat sigue siendo una niña, más joven que yo, la admiración inconsciente añade otro punto.
Quiero escribir un juego de sombras porque finalmente tengo tiempo para leer los artículos relacionados con los juguetes de sombras del blogger recientemente. Pero para ser honesto, creo que ya tengo una cierta comprensión del sombreador, pero todavía es muy difícil de aprender. Después de dos semanas de tanteo, probablemente entendí un poco, así que quiero usar este shader como punto de intervención. para comenzar mis propias notas de estudio. Sin saberlo, escribí muchas tonterías, así que comencemos a escribir el texto.
texto
No hace falta decir algunos efectos y principios de Shadowrtoy, puedes hacer clic aquí para ver si estás interesado . Como estoy aprendiendo Unity, sigo prefiriendo usar Shadertoy después de pasar al Shaderlab de Unity. La primera cosa que quiero hablar es de la plantilla de candycat 's shadertoy a shaderlab. A continuación se muestra el código original del blogger.
//Design By candycat(https://blog.csdn.net/candycat1992)
Shader "Shadertoy/Template" {
Properties{
iMouse ("Mouse Pos", Vector) = (100, 100, 0, 0)
iChannel0("iChannel0", 2D) = "white" {}
iChannelResolution0 ("iChannelResolution0", Vector) = (100, 100, 0, 0)
}
CGINCLUDE
#include "UnityCG.cginc"
#pragma target 3.0
#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define iGlobalTime _Time.y
#define mod fmod
#define mix lerp
#define fract frac
#define texture2D tex2D
#define iResolution _ScreenParams
#define gl_FragCoord ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy)
#define PI2 6.28318530718
#define pi 3.14159265358979
#define halfpi (pi * 0.5)
#define oneoverpi (1.0 / pi)
fixed4 iMouse;
sampler2D iChannel0;
fixed4 iChannelResolution0;
struct v2f {
float4 pos : SV_POSITION;
float4 scrPos : TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.scrPos = ComputeScreenPos(o.pos);
return o;
}
vec4 main(vec2 fragCoord);
fixed4 frag(v2f _iParam) : COLOR0 {
vec2 fragCoord = gl_FragCoord;
return main(gl_FragCoord);
}
vec4 main(vec2 fragCoord) {
return vec4(1, 1, 1, 1);
}
ENDCG
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_precision_hint_fastest
ENDCG
}
}
FallBack Off
}
Para ser honesto, el código está aturdido antes de mirar algunas líneas. ¿Por qué hay una gran sección de código de shaderlab fuera del sub-sombreador? ¿Por qué se agregan tres líneas de instrucciones pragma al canal del sub-sombreador? ¿Qué pasa con los sombreadores de vértices y los sombreadores de fragmentos? Aunque las preguntas salieron una por una, pero aún así se mordió la bala y escribí el código nuevamente (¡escribir código es realmente importante!). Me obligué a verificar la información y finalmente vi una pista, y una vez más lamenté que no era bueno para aprender.
De hecho, al mirar el código, me perdí una palabra clave
CGINCLUDE
Cuando lo vi por primera vez, entendí directamente CGINCLUDE como CGPROGRAM de shaderlab. Al escribir el código, agregué con confianza un signo # delante de él. Fue una apuesta terrible. En el código anterior, hay un segmento de código personalizado entre CGINCLUDE y ENDCG, y todavía se llama en el shaderlab actual, por lo que no hay información de inclusión. Las referencias vert y frag bajo el canal del subhader SubShader son las dos funciones definidas en el segmento de código personalizado anterior. De repente, ahora que entiendo esta plantilla, la restauro a una versión que puedo entender basada en la plantilla anterior. El código es el siguiente.
Shader "Shadertoy/Template" {
Properties{
iMouse ("Mouse Pos", Vector) = (100, 100, 0, 0)
iChannel0("iChannel0", 2D) = "white" {}
iChannelResolution0 ("iChannelResolution0", Vector) = (100, 100, 0, 0)
}
SubShader {
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
//使用低精度来提升片段着色器的运行速度 一般指fp16 半精度
#pragma fragmentoption ARB_precision_hint_fastest
#include "UnityCG.cginc"
#pragma target 3.0
//定义各种常用宏
#define vec2 float2
#define vec3 float3
#define vec4 float4
#define mat2 float2x2
#define mat3 float3x3
#define mat4 float4x4
#define iGlobalTime _Time.y
#define mod fmod
#define mix lerp
#define fract frac
#define texture2D tex2D
//_ScreenParams为屏幕的分辨率
#define iResolution _ScreenParams
#define PI2 6.28318530718
#define pi 3.14159265358979
#define halfpi (pi * 0.5)
#define oneoverpi (1.0 / pi)
fixed4 iMouse;
sampler2D iChannel0;
fixed4 iChannelResolution0;
struct v2f {
float4 pos : SV_POSITION;
float4 scrPos : TEXCOORD0;
};
v2f vert(appdata_base v) {
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
//将顶点转成屏幕坐标
o.scrPos = ComputeScreenPos(o.pos);
return o;
}
/*代码是从上到下读取的,要想在方法前面调用还没定义好的main函数,需要先声main方法
或者将main方法写在调用之前,这里将main方法写在后面是为了代码的可观性 因这之后逻辑大都在main方法上编写
*/
vec4 main(vec2 fragCoord);
fixed4 frag(v2f _iParam) : COLOR0 {
/*
1.在四维中有xyzw四个分量 其中xyz三个点与w相除得到归一化的点
2.(_iParam.srcPos.xy/_iParam.srcPos.w)将得到在屏幕中归一化后的屏幕位置
3.最后与屏幕的分辨率相乘获得具体的位置
*/
vec2 fragCoord = ((_iParam.scrPos.xy/_iParam.scrPos.w) * _ScreenParams.xy);
return main(fragCoord);
}
vec4 main(vec2 fragCoord) {
return vec4(1, 1, 1, 1);
}
ENDCG
}
}
FallBack Off
}
Personalmente, creo que la lógica es muy clara si escribo de esta manera. Después de todo, todavía estoy acostumbrado a ver el efecto directamente en Unity. El navegador mira a Shadertoy. Después de aprender, se espera que algunos de los efectos se ejecuten normalmente en la unidad, por supuesto, se convertirá a shadowrtoy para ver cómo queda el efecto en la web.
Hay muchas tonterías, así que esta vez me detendré aquí. No siento que pueda escribir demasiado a la vez, al igual que solía aprender sombreadores, siempre quiero comer un gran pastel de una vez, y se descargará antes de la digestión y la absorción. Esta analogía es un poco repugnante pero es verdad. Ha pasado mucho tiempo desde que comencé a estudiar mucho. Espero que este sea un buen comienzo y registre todo el proceso de aprendizaje del juego de sombras.
Perseverancia ~