108 lines
2.9 KiB
GLSL
108 lines
2.9 KiB
GLSL
Shader "Oxysoft/Dither" {
|
|
Properties {
|
|
_Threshold ("Threshold", Float) = 0.45
|
|
_Strength ("Strength", Float) = 0.45
|
|
_Width ("Width", Int) = 0.45
|
|
_Height ("Height", Int) = 0.45
|
|
_Dither ("Dither", 2D) = "white" {}
|
|
_MainTex ("", 2D) = "white" {}
|
|
}
|
|
|
|
SubShader {
|
|
Lighting Off
|
|
ZTest Always
|
|
Cull Off
|
|
ZWrite Off
|
|
Fog { Mode Off }
|
|
|
|
Pass {
|
|
CGPROGRAM
|
|
// Upgrade NOTE: excluded shader from DX11, Xbox360, OpenGL ES 2.0 because it uses unsized arrays
|
|
#pragma exclude_renderers flash
|
|
#pragma vertex vert_img
|
|
#pragma fragment frag
|
|
#pragma fragmentoption ARB_precision_hint_fastest
|
|
#include "UnityCG.cginc"
|
|
|
|
uniform float _Threshold;
|
|
uniform float _Strength;
|
|
uniform int _Width;
|
|
uniform int _Height;
|
|
|
|
uniform sampler2D _Dither;
|
|
uniform sampler2D _MainTex;
|
|
|
|
float luma(fixed3 color) {
|
|
return dot(color, fixed3(0.299, 0.587, 0.114));
|
|
}
|
|
|
|
float luma(fixed4 color) {
|
|
return dot(color.rgb, fixed3(0.299, 0.587, 0.114));
|
|
}
|
|
|
|
fixed4 ditherBayer2(fixed2 position, float brightness) {
|
|
int x = fmod(position.x, 4.0);
|
|
int y = fmod(position.y, 4.0);
|
|
|
|
int index = x + y * 4;
|
|
float lim = 0.0;
|
|
|
|
if (x < 8) {
|
|
if (index == 0) lim = 0.0625;
|
|
if (index == 1) lim = 0.5625;
|
|
if (index == 2) lim = 0.1875;
|
|
if (index == 3) lim = 0.6875;
|
|
if (index == 4) lim = 0.8125;
|
|
if (index == 5) lim = 0.3125;
|
|
if (index == 6) lim = 0.9375;
|
|
if (index == 7) lim = 0.4375;
|
|
if (index == 8) lim = 0.25;
|
|
if (index == 9) lim = 0.75;
|
|
if (index == 10) lim = 0.125;
|
|
if (index == 11) lim = 0.625;
|
|
if (index == 12) lim = 1.0;
|
|
if (index == 13) lim = 0.5;
|
|
if (index == 14) lim = 0.875;
|
|
if (index == 15) lim = 0.375;
|
|
}
|
|
|
|
if (brightness < lim * _Strength)
|
|
return 0.0;
|
|
|
|
return 1.0;
|
|
}
|
|
|
|
fixed3 ditherPattern2(fixed2 position, float brightness) {
|
|
int x = fmod(position.x, _Width);
|
|
int y = fmod(position.y, _Height);
|
|
|
|
float lim = 0.0;
|
|
|
|
lim = tex2D(_Dither, fixed2(x, y) / _Width).r;
|
|
|
|
if (brightness < lim * _Threshold)
|
|
return _Strength;
|
|
|
|
return 1.0;
|
|
}
|
|
|
|
fixed3 ditherBayer(fixed2 position, fixed3 col) {
|
|
return col * ditherBayer2(position, luma(col));
|
|
}
|
|
|
|
fixed3 ditherPattern(fixed2 position, fixed3 col) {
|
|
return col * ditherPattern2(position, luma(col));
|
|
}
|
|
|
|
fixed4 frag (v2f_img i) : COLOR
|
|
{
|
|
fixed3 col = tex2D (_MainTex, i.uv).rgb;
|
|
return fixed4(ditherPattern(i.pos.xy, col), 1.0);
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
|
|
FallBack "Diffuse"
|
|
}
|