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 }