Писать впереди
Прошло три года с тех пор, как Unity изучает и работает. Первое, с чем я сталкиваюсь при разработке, - это поиск Baidu. У меня никогда не было собственных идей, и мне стыдно. Думая, что я больше не могу быть таким запутанным, я также решил открыть блог, чтобы записывать, что я нашел полезным в разработке. Я надеюсь, что однажды в будущем я не буду чувствовать, что моя жизнь напрасна. Если я может помочь некоторым нуждающимся студентам, тогда и быть лучше.
О шейдере
Говоря об этом, это также очень связано с шейдером, потому что я раньше изучал C #, и моя первая работа - разработка серверной части веб-сайта. С тех пор, как я изучил Unity, я был знаком с дорогой, и это не сложно. просматривая некоторые статьи, я понял, что знаю немного, но я думаю, что интервью не должно быть большой проблемой. Буквально за ночь до интервью я увидел несколько вопросов для интервью и понял, что существует шейдер. интервью на следующий день было связано с Shader. Первая статья в блоге связана с шейдером, вероятно, чтобы вернуться к первоначальному замыслу, в конце концов, это было впервые в этом году.
Что касается этого шейдера, я должен поговорить о леденце-блогере . После работы я столкнулся с проблемами шейдеров, которые практически невозможно было решить лично, и человек, который меня взял, порекомендовал мне этого блогера. В то время я даже не потрудился войти в систему с учетной записью CSDN, поэтому я узнал о шейдере, просматривая ее статьи одну за другой. В течение этого периода я также покупал книги по шейдерам, которые она опубликовала, но у меня нет. Я еще не дочитал, так что мне очень стыдно. После изучения, хотя я не могу понять шейдер, по крайней мере, прочитать код шейдера и написать несколько простых эффектов шейдера не является большой проблемой. Говоря о Candycat все еще девочке, младше меня, подсознательное восхищение добавляет еще один момент.
Я хочу написать shadertoy, потому что у меня, наконец, есть время прочитать статьи блоггера, связанные с shadetoy, недавно. Но, честно говоря, я думаю, что у меня уже есть определенное представление о шейдере, но его все еще очень сложно изучить.После двух недель поисков я, вероятно, немного понял, поэтому я хочу использовать эту шейдерную игрушку в качестве точки вмешательства. чтобы начать свои собственные заметки для изучения. По незнанию я написал много ерунды, так что давайте просто начнем писать текст.
текст
Излишне говорить о некоторых эффектах и принципах shadertoy, вы можете щелкнуть здесь, если вам интересно . Поскольку я изучаю Unity, я все еще предпочитаю использовать Shadertoy после обращения к Shaderlab от Unity. Первое, о чем я хочу поговорить, это о шаблоне шейдерной игрушки Candycat для shaderlab. Ниже оригинальный код блогера.
//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
}
Если честно, код ошеломлен, прежде чем взглянуть на несколько строк.Почему есть большой участок кода шейдерной лаборатории вне суб-шейдера? Почему в канал суб-шейдера добавлены три строки инструкций прагмы? А как насчет вершинных шейдеров и фрагментных шейдеров? Хотя вопросы выходили один за другим, но все же укусили пулю и снова написали код (написание кода действительно важно!). Я заставил себя проверить информацию и, наконец, увидел ключ к разгадке и снова пожаловался, что у меня плохо получается учиться.
На самом деле, глядя на код, я пропустил ключевое слово
CGINCLUDE
Когда я впервые увидел его, я напрямую понял CGINCLUDE как CGPROGRAM шейдерлаба. При вводе кода я уверенно добавил перед ним знак #. Это была ужасная ставка. В приведенном выше коде есть сегмент пользовательского кода между CGINCLUDE и ENDCG, и он по-прежнему вызывается в текущей таблице шейдеров, поэтому информация о включении отсутствует. Ссылки vert и frag в канале субшейдера SubShader являются двумя функциями, определенными в сегменте пользовательского кода выше. Внезапно, когда я понимаю этот шаблон, я восстанавливаю его до версии, которую я могу понять на основе указанного выше шаблона.Код выглядит следующим образом.
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
}
Лично я думаю, что логика очень ясна, если я напишу так. В конце концов, я все еще привык видеть эффект непосредственно в Unity. Браузер смотрит на shadertoy. После изучения некоторых эффектов, которые, как ожидается, будут нормально работать в единстве, они, конечно же, будут преобразованы в shadertoy, чтобы увидеть, как эффект проявляется в сети.
Здесь много ерунды, поэтому на этот раз я остановлюсь на этом. Я не чувствую, что могу написать слишком много за один раз, точно так же, как я раньше учил шейдеры, я всегда хочу съесть целый большой пирог сразу, и он будет разряжен до переваривания и усвоения. Эта аналогия немного отвратительна, но это правда. Прошло много времени с тех пор, как я начал усердно учиться. Надеюсь, это будет хорошим началом и запишет весь процесс изучения shadetoy.
Настойчивость ~