Запуск шейдера и ShaderToy

Писать впереди

        Прошло три года с тех пор, как 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.

        Настойчивость ~

рекомендация

отblog.csdn.net/ssssssilver/article/details/81111432
рекомендация