рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рдХреЗ рд╕рд╛рдордиреЗ рдПрдХ рдЧреЗрдо рдмрдирд╛рдирд╛ - рднрд╛рдЧ 2: CRT / LCD рдХреЗ рддрд╣рдд рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрд╕

рдЪрд▓рд┐рдП рдЗрд╕ рдмрд╛рд░ рддрдХрдиреАрдХ рдХреА рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдмрддрд╛рдКрдВрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗ рдкреБрд░рд╛рдиреЗ CRTs рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдЯреА рдореЗрдВ рдПрдХ рд╢реЗрдбрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рдРрд╕реА рдПрдХ рдЫрд╛рдпрд╛ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд▓рд╛ рдХреЗ рд▓рд┐рдП рдФрд░ рдПрдХ рдкреНрд░рд╛рдЪреАрди рддрдХрдиреАрдХ рдХреЗ рд╕рд╛рде рдПрдХ рддрд╕реНрд╡реАрд░ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред рдЙрдирдХрд╛ рджреБрд░реБрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЬрдЧрд╣ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред (рдореИрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕реНрдкрд╖реНрдЯ рдХрд░реВрдВрдЧрд╛ - рдореИрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рднрд╛рд╡ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реНрдкреНрд▓реИрд╢ рд╕реНрдХреНрд░реАрди рдореЗрдВ - рдпрд╣ рдПрдХ рдЬрдЧрд╣ рдкрд░ рдЖ рд╕рдХрддрд╛ рд╣реИ)ред



рдФрд░ рдореИрдВ рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рдг рдХрд░ рджреВрдВрдЧрд╛ - рдореБрдЭреЗ рд╢реЗрдбреНрд╕ рдХреА рдЧрд╣рд░реА рд╕рдордЭ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкрд╛рдардХ рд╕реЗ рдФрд░ рднреА рдХрдо рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рдЖрдзрд╛рд░ рдкрд░ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рдЖрдк shaders рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ, рдпрд╛ рд▓рдЧрднрдЧ рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИред рдФрд░ рд╣рд╛рдБ, рдореИрдВ рдЖрдкрдХреЛ shaders рдХреЗ рдХрд╛рдо рдХреЗ рдмрд╣реБрдд рдЖрдзрд╛рд░реЛрдВ рдХреЛ рд╕рдордЭрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдБрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрджрд┐ рдЖрдк рдЙрдирдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рдирд╣реАрдВ рдЬрд╛рдирддреЗ рд╣реИрдВ - рд╕реНрд╡рд╛рдЧрдд рд╣реИ!



рд╢реЗрдб рдХреНрдпрд╛ рд╣реИрдВ рдФрд░ рд╡реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ?


рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рдПрдХ shader рдПрдХ рдЫреЛрдЯрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡рд░реНрдЯреЗрдХреНрд╕ (vertex shaders) рдХреЗ рд▓рд┐рдП рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдкрд┐рдХреНрд╕реЗрд▓ (рдкрд┐рдХреНрд╕реЗрд▓ рдпрд╛ "рдлреНрд░реЗрдореЗрдВрдЯрд▓ shaders) рдХреЗ рд▓рд┐рдП рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ - рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдПрдХ рддреНрд░рд┐рдХреЛрдг рдкрд░ рдПрдХ рдмрдирд╛рд╡рдЯ рдЦреАрдВрдЪрдирд╛ рдПрдХ shader рд╣реИред рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╢реЗрдбрд░ рдореЗрдВ, рдЗрд╕рдХрд╛ рд╢реАрд░реНрд╖ рднрд╛рдЧ рддреНрд░рд┐рдХреЛрдг рдХреЗ рдХреЛрдиреЗ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рднрд╛рдЧ рд╕реАрдзреЗ рдмрдирд╛рд╡рдЯ рдХреЗ рдкрд┐рдХреНрд╕рд▓ рдХреЛ рдЦреАрдВрдЪрддрд╛ рд╣реИред рдФрд░, рддрджрдиреБрд╕рд╛рд░, рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП shader рдХреЛ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡реЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЯрд┐рдкреНрдкрдгреАред рдкреНрд░рддреНрдпреЗрдХ shader рдЗрдирдкреБрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рджреЗрддрд╛ рд╣реИред рдХрд┐рд╕ рдкрд░, рдпрд╣ рдХрд┐рд╕реА рднреА рдХреНрд░рдо рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЖрдзреБрдирд┐рдХ рдХрд╛рд░реНрдбреЛрдВ рдореЗрдВ, рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╢реЗрдб рдереНрд░реЗрдбреНрд╕ рдЬреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рдЬрдм рдПрдХ shader рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (0, 0) рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рджреВрд╕рд░реЗ рдЙрд╕реА рдХреНрд╖рдг рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ (10, 10) рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдЬрдм (0, 1) рдореЗрдВ рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╢реЗрдбрд░ рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ (0, 0) рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрддрд╛ рдирд╣реАрдВ рд╣реИ (рдФрд░ рдкрд╣реБрдВрдЪ рдирд╣реАрдВ рд╣реИ)ред рдпрд╣ рдХреЗрд╡рд▓ рдореВрд▓ рдореВрд▓реНрдп рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдХрдИ рдкреНрд░рднрд╛рд╡реЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрдИ рд╢реЗрдбреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реЛрдЧреАред

рдПрдХрддрд╛ рдореЗрдВ, рдЖрдк рд╡рд┐рднрд┐рдиреНрди shader рднрд╛рд╖рд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ CG рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ OpenGL рдФрд░ DirectX рджреЛрдиреЛрдВ рдореЗрдВ рдареАрдХ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред рддрджрдиреБрд╕рд╛рд░, рд╣рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╢реЗрдбреНрд╕ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЕрдм, рдЕрдЧрд▓реЗ рд╣реА рдкрд▓ - рдЫрд╡рд┐ рдХреЗ рдмрд╛рдж рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬреЛ рдХрд┐ рд╣рдордиреЗ рдЬреЛ рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ рд╣реИ рд╡рд╣ рдареАрдХ рд╣реИ) - рд╣рдореЗрдВ рдЦреБрдж рдХреЛ рд╕реНрдкреНрд░рд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреВрд░реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╢реЗрдбрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рд░реЗрдВрдбрд░ рдХреЛ рдкрд╣рд▓реЗ рдмрдирд╛рд╡рдЯ рдкрд░ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╢реЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдпрд╣ рдмрдирд╛рд╡рдЯ рд╕реНрдХреНрд░реАрди рдкрд░ рдЦреАрдВрдЪреА рдЬрд╛рдПрдЧреАред рдФрд░ рд╣рд╛рдВ, рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХрддрд╛ рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░реЛ рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рддреЛ рдпреБрджреНрдз рдХреЗ рд▓рд┐рдП


рдкрд╣рд▓реА рдЪреАрдЬ рдЬреЛ рд╣рдореЗрдВ рдЪрд╛рд╣рд┐рдП рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдкреВрд░реЗ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢реЗрдбрд░ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдХреБрдЫ рднреА рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ shader рдмрдирд╛рдПрдВ (.shader рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓) рдФрд░ рдЗрд╕ рдбрд┐рд╕реНрдХ рдХреЛ рд╡рд╣рд╛рдВ рдХреЙрдкреА рдХрд░реЗрдВ:

Shader "Custom/CRTShader" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} } SubShader { Pass { ZTest Always Cull Off ZWrite Off Fog { Mode off } CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma fragmentoption ARB_precision_hint_fastest #include "UnityCG.cginc" #pragma target 3.0 struct v2f { float4 pos : POSITION; float2 uv : TEXCOORD0; }; uniform sampler2D _MainTex; v2f vert(appdata_img v) { v2f o; o.pos = mul(UNITY_MATRIX_MVP, v.vertex); o.uv = MultiplyUV(UNITY_MATRIX_TEXTURE0, v.texcoord); return o; } half4 frag(v2f i): COLOR { half4 color = tex2D(_MainTex, i.uv); return color; } ENDCG } } FallBack "Diffuse" } 

рдореИрдВ рдореБрдЦреНрдп рдмрд┐рдВрджреБрдУрдВ рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реВрдВрдЧрд╛:

рдмрд╕ рдереЛрдбрд╝рд╛ рд╕рд╛ рдмрдЪрд╛ рд╣реИред рд╣рдореЗрдВ рдХреИрдорд░реЗ рдХреЗ рд▓рд┐рдП рдПрдХ shader рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, C # рдореЗрдВ рдПрдХ рдФрд░ рдХрдВрдЯреНрд░реЛрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдмрдирд╛рдПрдВ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 using UnityEngine; [ExecuteInEditMode] [RequireComponent(typeof(Camera))] public class TVShader : MonoBehaviour { public Shader shader; private Material _material; protected Material material { get { if (_material == null) { _material = new Material(shader); _material.hideFlags = HideFlags.HideAndDontSave; } return _material; } } private void OnRenderImage(RenderTexture source, RenderTexture destination) { if (shader == null) return; Material mat = material; Graphics.Blit(source, destination, mat); } void OnDisable() { if (_material) { DestroyImmediate(_material); } } } 

рдпрд╣ рдХреЗрд╡рд▓ рдХреИрдорд░реЗ рдкрд░ рдлреЗрдВрдХрдиреЗ рдФрд░ "shader" рдлрд╝реАрд▓реНрдб рдореЗрдВ рд╣рдорд╛рд░реЗ shader рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИред

рдХреИрд╕реЗ рд╕рдордЭреЗрдВ рдХрд┐ рдпрд╣ рд╡реНрдпрд╡рд╕рд╛рдп рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ? " return color " рд╕реЗ рдкрд╣рд▓реЗ shader рдореЗрдВ color.r = 0; рдЬреИрд╕рд╛ рдХреБрдЫ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ color.r = 0; рдФрд░ рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рд▓рд╛рд▓ рд░рдВрдЧ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИред

рдЗрд╕рд▓рд┐рдП, рд╣рдордиреЗ рд╢рд╛рджрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ред

рдкреНрд░рднрд╛рд╡ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рд╣реЛ рд░рд╣реА рд╣реИред


рд╣рдо рдХреНрдпрд╛ рд╣рд╛рд╕рд┐рд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЙрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдорд╣рд╕реВрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ рдЬрдм рдЫрд╡рд┐ рдореЗрдВ рд░рдВрдЧ рдЖрд░рдЬреАрдмреА рдкрд┐рдХреНрд╕реЗрд▓ рд╣реЛрддреЗ рд╣реИрдВред рд╡рд╣ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


рдпрд╣ рдХреИрд╕реЗ рдХрд░рдирд╛ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред 3 рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдЪрдХреНрд░ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рддреНрдпреЗрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ R, G рдФрд░ B рдШрдЯрдХ рдЫреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред

рдХрд╛рд░реНрдп рд╕рдВрдЦреНрдпрд╛ 1 - рдкрд┐рдХреНрд╕реЗрд▓ shader рдореЗрдВ рд╡рд░реНрддрдорд╛рди рдмрд┐рдВрджреБ рдХреЗ рд╕реНрдХреНрд░реАрди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред

рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╡рд░реНрдЯреЗрдХреНрд╕ рд╢реЗрдбрд░ рдореЗрдВ рдХреБрдЫ рдЧрд┐рдирдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕ рдЪреАрдЬрд╝ рдХреЛ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╡рд░реНрдЯреЗрдХреНрд╕ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ v2f рдмреАрдЪ рдбреЗрдЯрд╛ рдХреЗ рдЖрджрд╛рди-рдкреНрд░рджрд╛рди рдХреЗ рд▓рд┐рдП, v2f рдирд┐рд░реНрдорд╛рдг рдХрд╛ v2f рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдлрд┐рд▓рд╣рд╛рд▓ рджреЛ рдлрд╝реАрд▓реНрдб рд╣реИрдВ - pos рдФрд░ uv ред рд╡рд╣рд╛рдВ рдЬреЛрдбрд╝реЗрдВ:
 float4 scr_pos : TEXCOORD1; 

рдФрд░ рд╡рд░реНрдЯреЗрдХрд░ shader рдореЗрдВ рдПрдХ рдкрдВрдХреНрддрд┐ рднреА рдЬреЛрдбрд╝реЗрдВ:
 o.scr_pos = ComputeScreenPos(o.pos); 

рдЕрдм рдкрд┐рдХреНрд╕реЗрд▓ shader рдореЗрдВ рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЛ 0 (1 ... 1) рд╕реЗ рд╕реАрдорд╛ рдореЗрдВ рд╕рдордиреНрд╡рдпрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдкрд┐рдХреНрд╕рд▓ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рднреА рдмрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 float2 ps = i.scr_pos.xy *_ScreenParams.xy / i.scr_pos.w; 

рд╣реБрд░реНрд░реЗ! ps рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕реНрдХреНрд░реАрди рдкрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИрдВред рддрдм рд╕рдм рдХреБрдЫ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИред рдЖрдкрдХреЛ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛:
 int pp = (int)ps.x % 3; //     3 float4 outcolor = float4(0, 0, 0, 1); if (pp == 1) outcolor.r = color.r; else if (pp == 2) outcolor.g = color.g; else outcolor.b = color.b; return outcolor; 

рд╣рдореЗрдВ рдРрд╕рд╛ рдХреБрдЫ рдорд┐рд▓рддрд╛ рд╣реИ:


рджреЛ рдмрд┐рдВрджреБ рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╣реЛрддреЗ рд╣реИрдВ - рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░рднрд╛рд╡ рдмрд╣реБрдд рдордЬрдмреВрдд рдирд┐рдХрд▓рд╛, рдФрд░ рджреВрд╕рд░реА рдмрд╛рдд, рдЪрд┐рддреНрд░ рдЧрд╣рд░рд╛ рд╣реЛ рдЧрдпрд╛ред рднрдЧрд╡рд╛рди рдХрд╛ рд╢реБрдХреНрд░ рд╣реИ, рдкрд╣рд▓реЗ рдХреЛ рд╕рд╣реА рдХрд┐рдпрд╛, рджреВрд╕рд░реЗ рдХреЛ рднреА рд╕рд╣реА рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдореИрдВ рдЖрд░ / рдЬреА / рдмреА рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдЦреНрдд рдЕрд▓рдЧрд╛рд╡ рдирд╣реАрдВ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ рд╕рднреА рдШрдЯрдХреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдХрд░, рдмрд╕ рдПрдХ рдЕрд▓рдЧ рдЕрдиреБрдкрд╛рдд рдореЗрдВред рдпрд╣реА рд╣реИ, "рд▓рд╛рд▓" рдХреЙрд▓рдо рдореЗрдВ 100% рдЖрд░, рдФрд░ рд▓рдЧрднрдЧ 50% рдЬреА рдФрд░ рдмреАред рдФрд░ рдЗрд╕рд╕реЗ рднреА рдмреЗрд╣рддрд░ рдЕрдЧрд░ рд╣рдо рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдорд╛рд░рд╛ рд░реВрдкрд╛рдВрддрд░рдг рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЧреБрдгрдХ рджреНрд╡рд╛рд░рд╛ рд░рдВрдЧ рдХреЛ рдЧреБрдгрд╛ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЖрд░ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ float4(1, 0, 0, 1) рджреНрд╡рд╛рд░рд╛ color рдЧреБрдгрд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ (4 рд╡рд╛рдВ рдШрдЯрдХ рдЕрд▓реНрдлрд╛ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдирд╣реАрдВ рдмрджрд▓рддреЗ рд╣реИрдВ)ред рд╣рдо рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдпрд╣реА рд╣реИ, рд▓рд╛рд▓ рд╕реНрддрдВрдн рдХреЛ (1, k1, k2, 1), рд╣рд░реЗ рд░рдВрдЧ рдХреЛ рдПрдХ (k2, 1, k1, 1) рдФрд░ рдиреАрд▓реЗ рд░рдВрдЧ рдХреЛ рдПрдХ (k1, k2, 1, 1) рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВред

рд╢реБрд░реБрдЖрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, shader рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рджреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВ:
 _VertsColor("Verts fill color", Float) = 0 _VertsColor2("Verts fill color 2", Float) = 0 

рдлрд┐рд░ рд▓рд┐рдВрдХ рд▓рд┐рдЦреЗрдВ:
 uniform float _VertsColor; uniform float _VertsColor2; 

рдЕрдм рдкрд┐рдХреНрд╕реЗрд▓ shader рдХреЛрдб рдкрд░ рдЬрд╛рдПрдВ рдФрд░ рд░рдВрдЧ рдореЗрдВ рд╣реЗрд░рдлреЗрд░ рдХрд░реЗрдВ:
 if (pp == 1) { muls.r = 1; muls.g = _VertsColor2; } else if (pp == 2) { muls.g = 1; muls.b = _VertsColor2; } else { muls.b = 1; muls.r = _VertsColor2; } color = color * muls; 

рдпрд╣ рдХреЗрд╡рд▓ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ рдХрд┐ рдЗрди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдПрдХрддрд╛ рдореЗрдВ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЖрдЗрдП рдЙрдиреНрд╣реЗрдВ рд╣рдорд╛рд░реЗ C # рдореЗрдВ рд▓рд┐рдЦреЗрдВ:
 [Range(0, 1)] public float verts_force = 0.0f; [Range(0, 1)] public float verts_force_2 = 0.0f; 

рдФрд░ OnRenderImage рдореЗрдердб рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕реЗ рдкрд╣рд▓реЗ рдЬреЛрдбрд╝реЗрдВред рдиреЛрдЯ:
 mat.SetFloat("_VertsColor", 1-verts_force); mat.SetFloat("_VertsColor2", 1-verts_force_2); 

рдпрд╣рд╛рдБ рдореИрдВ рдЗрд╕реЗ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП 1 рд╕реЗ рдШрдЯрд╛рддрд╛ рд╣реВрдБред рдкреИрд░рд╛рдореАрдЯрд░ рдЬрд┐рддрдирд╛ рдмрдбрд╝рд╛ рд╣реЛрдЧрд╛, рд╕реНрддрдВрдн рдХрд╛ рдЖрдХрд╛рд░ рдЙрддрдирд╛ рд╣реА рдордЬрдмреВрдд рд╣реЛрдЧрд╛ред

рдпрджрд┐ рдЖрдкрдиреЗ рд╕рдм рдХреБрдЫ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдХреИрдорд░рд╛ рдЪреБрдирддреЗ рд╕рдордп рдпреВрдирд┐рдЯреА рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдореЗрдВ, рдЖрдкрдХреЛ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:


рдЕрдм рдкреНрд░рднрд╛рд╡ рджреЗрдЦреЗрдВ:


рдмреЗрд╣рддрд░ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдЪрдордХ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЖрдЗрдП рд╣рдорд╛рд░реЗ рд╢реЗрдбрд░ рдореЗрдВ рдЪрдордХ рдФрд░ рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рд╕рдорд╛рдпреЛрдЬрди рдЬреЛрдбрд╝реЗрдВред
 _Contrast("Contrast", Float) = 0 _Br("Brightness", Float) = 0 .... uniform float _Contrast; uniform float _Br; .... color += (_Br / 255); color = color - _Contrast * (color - 1.0) * color *(color - 0.5); 

C # рд╕реНрдХреНрд░рд┐рдкреНрдЯ:
  [Range(-3, 20)] public float contrast = 0.0f; [Range(-200, 200)] public float brightness = 0.0f; ... mat.SetFloat("_Contrast", contrast); mat.SetFloat("_Br", brightness); 

рдкрд░рд┐рдгрд╛рдо:

(рд╡рд┐рдкрд░реАрдд = 2.1, рдЪрдордХ = 27)

рдЕрдм рд╕реНрдХреИрдирд▓рд╛рдЗрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рд╕рд░рд▓ рд╣реИред рд╣рд░ рддреАрд╕рд░реА рдкрдВрдХреНрддрд┐ рдХреЛ рдЧрд╣рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
 if ((int)ps.y % 3 == 0) muls *= float4(_ScansColor, _ScansColor, _ScansColor, 1); 




рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдкрд░реНрд╢ рдмреНрд▓реВрдо рдкреНрд░рднрд╛рд╡ рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ shader рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ ред

рд╣реЛ рдЧрдпрд╛! рд▓реЗрдЦ рдХреЗ рд╢реАрд░реНрд╖ рд╕реЗ рд╣рдореЗрдВ рдПрдХ рддрд╕реНрд╡реАрд░ рдорд┐рд▓рддреА рд╣реИ!



рд╣рд╛рдВ, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ - рдпрд╣ рд╢реЗрдбрд░ рдЯреНрд░рд┐рдкрд▓ рдкрд┐рдХреНрд╕реЗрд▓ рдкрд░ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд▓рдЧреЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореЗрд░реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рд╣реИред

UPD : рдЬреИрд╕рд╛ рдХрд┐ рдиреАрдЪреЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реБрдЭрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрдк рдЗрд╕ рдкреВрд░реА рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХреЗрд╡рд▓ рдПрдХ рдмрдирд╛рд╡рдЯ рдХреЛ рджреВрд╕рд░реЗ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдХреЗ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╛рдиреА рдмреИрдВрдб рдХреА рддреАрд╡реНрд░рддрд╛ рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╣рдо рдмрдирд╛рд╡рдЯ-рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдЧрддрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рддреЗрдЬ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рд▓рдХреНрд╖реНрдп рдЗрд╖реНрдЯрддрдо shader рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдерд╛, рдмрд▓реНрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рджреНрдзрд╛рдВрдд рдХреЛ рджрд┐рдЦрд╛рдирд╛ рдерд╛ред

рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХреЗ рд╕рднреА рд▓реЗрдЦ:
  1. рд╡рд┐рдЪрд╛рд░, рджреГрд╖реНрдЯрд┐, рд╕реЗрдЯрд┐рдВрдЧ рдХрд╛ рд╡рд┐рдХрд▓реНрдк, рдордВрдЪ, рд╡рд┐рддрд░рдг рдореЙрдбрд▓, рдЖрджрд┐ред
  2. CRT / LCD рдХреЗ рдЕрдВрддрд░реНрдЧрдд рдЪрд┐рддреНрд░реЛрдВ рдХреЛ рд╕реНрдЯрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢реЗрдбреНрд╕
  3. рд╣рдо рдПрдХрддрд╛ (UniLua) рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдЯрдХрдерд╛ рднрд╛рд╖рд╛ рдЙрдкрд╡рд╛рд╕
  4. рдкреИрд▓реЗрдЯ рджреНрд╡рд╛рд░рд╛ рдлреАрдХрд╛ рдХреЗ рд▓рд┐рдП рдЫрд╛рдпрд╛ (рдПрдХ рд▓рд╛ NES)
  5. рд╕рдмрдЯреЛрдЯрд▓ (рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк)
  6. рдЖрдЗрдП рдкреАрдЖрд░ рдЗрдВрдбреА рдЧреЗрдореНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ
  7. рдПрдХрддрд╛ рдореЗрдВ 2 рдбреА рдПрдирд┐рдореЗрд╢рди ("рдлреНрд▓реИрд╢ рдХреА рддрд░рд╣")
  8. рдПрдХрддрд╛ (рдХрдЯрдХ) рдореЗрдВ рдХрдЯ рджреГрд╢реНрдпреЛрдВ рдХреА рджреГрд╢реНрдп рдкрдЯрдХрдерд╛

Source: https://habr.com/ru/post/In211140/


All Articles