1 Shader "Hidden/NoiseAndGrainDX11" {
2     Properties {
3         _MainTex (
"Base (RGB)", 2D) = "white" {}
4         _NoiseTex (
"Noise (RGB)", 2D) = "white" {}
5     }
6     
7     CGINCLUDE
8
9         #include
"UnityCG.cginc"
10
11         sampler2D _MainTex;
12         sampler2D _NoiseTex;
13         float4 _NoiseTex_TexelSize;
14         
15         uniform float4 _MainTex_TexelSize;
16
17         uniform float3 _NoisePerChannel;
18         uniform float3 _NoiseTilingPerChannel;
19         uniform float3 _NoiseAmount;
20         uniform float3 _ThreshholdRGB;
21         uniform float3 _MidGrey;
22         uniform
float _DX11NoiseTime;
23
24         
// DX11 noise helper functions, credit: rgba/iq
25
26         
int ihash(int n)
27         {
28             n = (n<<
13)^n;
29             
return (n*(n*n*15731+789221)+1376312589) & 2147483647;
30         }
31
32         
float frand(int n)
33         {
34             
return ihash(n) / 2147483647.0;
35         }
36
37         
float cellNoise1f(int3 p)
38         {
39             
return frand(p.z*65536 + p.y*256 + p.x);//*2.0-1.0;
40         }
41
42         float3 cellNoise3f(int3 p)
43         {
44             
int i = p.z*65536 + p.y*256 + p.x;
45             
return float3(frand(i), frand(i + 57), frand(i + 113));//*2.0-1.0;
46         }
47         
48         
struct v2f
49         {
50             float4 pos : SV_POSITION;
51             float2 uv_screen : TEXCOORD0;
52             float4 uvRg : TEXCOORD1;
53             float2 uvB : TEXCOORD2;
54             float2 uvOffsets : TEXCOORD4;
55         };
56         
57         
struct appdata_img2
58         {
59             float4 vertex : POSITION;
60             float2 texcoord : TEXCOORD0;
61             float2 texcoord1 : TEXCOORD1;
62         };
63
64         inline float3 Overlay(float3 m, float3 color) {
65             float3 check = step(
0.5, color.rgb);
66             float3 result = check * (float3(
1,1,1) - ((float3(1,1,1) - 2*(color.rgb-0.5)) * (1-m.rgb)));
67             result += (
1-check) * (2*color.rgb) * m.rgb;
68             
return result;
69         }
70                         
71         v2f vert (appdata_img2 v)
72         {
73             v2f o;
74             
75             o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
76             
77         #
if UNITY_UV_STARTS_AT_TOP
78             o.uv_screen = v.vertex.xyxy;
79             
if (_MainTex_TexelSize.y < 0)
80                 o.uv_screen.y =
1-o.uv_screen.y;
81         #
else
82                 o.uv_screen = v.vertex.xy;
83         #endif
84             
85             // different tiling
for 3 channels
86             o.uvRg = v.texcoord.xyxy + v.texcoord1.xyxy * _NoiseTilingPerChannel.rrgg * _NoiseTex_TexelSize.xyxy;
87             o.uvB = v.texcoord.xy + v.texcoord1.xy * _NoiseTilingPerChannel.bb * _NoiseTex_TexelSize.xy;
88
89             o.uvOffsets = v.texcoord.xy;
90
91             
return o;
92         }
93
94         float4 fragDX11 ( v2f i ) : SV_Target
95         {
96             float4 color = saturate(tex2D (_MainTex, i.uv_screen.xy));
97             
98             // black & white intensities
99             float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey
100             blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(
1.0/0.8, -1.0/0.2));
101
102             
float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy));
103             
104             float3 m = cellNoise3f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime));
105             m = saturate(lerp(float3(
0.5,0.5,0.5), m, _NoisePerChannel.rgb * finalIntensity));
106             
107             
return float4(Overlay(m, color.rgb), color.a);
108         }
109
110         float4 fragDX11Monochrome ( v2f i ) : SV_Target
111         {
112             float4 color = saturate(tex2D (_MainTex, i.uv_screen.xy));
113             
114             // black & white intensities
115             float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey
116             blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(
1.0/0.8, -1.0/0.2));
117
118             
float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy));
119             
120             float3 m = cellNoise1f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime));
121             m = saturate(lerp(float3(
0.5,0.5,0.5), m, finalIntensity));
122             
123             
return float4(Overlay(m, color.rgb), color.a);
124         }
125
126         float4 fragDX11Tmp ( v2f i ) : SV_Target
127         {
128             float4 color = saturate(tex2D (_MainTex, i.uv_screen.xy));
129             
130             // black & white intensities
131             float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey
132             blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(
1.0/0.8, -1.0/0.2));
133
134             
float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy));
135             
136             float3 m = cellNoise3f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime));
137             m = saturate(lerp(float3(
0.5,0.5,0.5), m, _NoisePerChannel.rgb * finalIntensity));
138             
139             
return float4(m.rgb, color.a);
140         }
141
142         float4 fragDX11MonochromeTmp ( v2f i ) : SV_Target
143         {
144             float4 color = saturate(tex2D (_MainTex, i.uv_screen.xy));
145             
146             // black & white intensities
147             float2 blackWhiteCurve = Luminance(color.rgb) - _MidGrey.x; // maybe tweak middle grey
148             blackWhiteCurve.xy = saturate(blackWhiteCurve.xy * _MidGrey.yz); //float2(
1.0/0.8, -1.0/0.2));
149
150             
float finalIntensity = _NoiseAmount.x + max(0.0f, dot(_NoiseAmount.zy, blackWhiteCurve.xy));
151             
152             float3 m = cellNoise1f(float3( (i.uv_screen.xy + i.uvOffsets) * _MainTex_TexelSize.zw, _DX11NoiseTime));
153             m = saturate(lerp(float3(
0.5,0.5,0.5), m, finalIntensity));
154             
155             
return float4(m.rgb, color.a);
156         }
157
158         float4 fragOverlayBlend ( v2f i ) : SV_Target
159         {
160             float4 color = saturate(tex2D (_MainTex, i.uv_screen.xy));
161             float4 m = saturate(tex2D (_NoiseTex, i.uv_screen.xy));
162             
163             
return float4(Overlay(m, color.rgb), color.a);
164         }
165     
166     ENDCG
167     
168     SubShader {
169         ZTest Always Cull Off ZWrite Off Blend Off
170
171         Pass {
172     
173         CGPROGRAM
174         
175         #pragma exclude_renderers gles xbox360 ps3 d3d9
176         #pragma target
5.0
177         #pragma vertex vert
178         #pragma fragment fragDX11
179         
180         ENDCG
181          
182         }
183
184         Pass {
185     
186         CGPROGRAM
187         
188         #pragma exclude_renderers gles xbox360 ps3 d3d9
189         #pragma target
5.0
190         #pragma vertex vert
191         #pragma fragment fragDX11Monochrome
192
193         ENDCG
194          
195         }
196
197         Pass {
198     
199         CGPROGRAM
200         
201         #pragma exclude_renderers gles xbox360 ps3 d3d9
202         #pragma target
5.0
203         #pragma vertex vert
204         #pragma fragment fragDX11Tmp
205     
206         ENDCG
207          
208         }
209
210         Pass {
211     
212         CGPROGRAM
213         
214         #pragma exclude_renderers gles xbox360 ps3 d3d9
215         #pragma target
5.0
216         #pragma vertex vert
217         #pragma fragment fragDX11MonochromeTmp
218         
219         ENDCG
220          
221         }
222
223         Pass {
224     
225         CGPROGRAM
226         
227         #pragma exclude_renderers gles xbox360 ps3 d3d9
228         #pragma target
5.0
229         #pragma vertex vert
230         #pragma fragment fragOverlayBlend
231         
232         ENDCG
233          
234         }
235     }
236     FallBack Off
237 }


Gõ tìm kiếm nhanh...