Shader "Unlit/PrettySkin 2.0" { Properties { _Bilateral("Texture", 2D) = "white" {} _Canny("Texture", 2D) = "white" {} _MainTex ("Texture", 2D) = "white" {} _smoothDegree("smoothDegree" ,Range(0,1)) = 0.5 _Log("Log",Range(0,3)) = 0 _BSIGMA("BSIGMA",Range(0,1)) = 0.1 _SIGMA("SIGMA",Range(3,15)) = 7 } SubShader { Tags { "RenderType"="Opaque" } LOD 100 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_TexelSize; float4 _MainTex_ST; float _SIGMA; float _BSIGMA; #define MSIZE 15 v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } float normpdf(in float x, in float sigma) { return 0.39894*exp(-0.5*x*x / (sigma*sigma)) / sigma; } float3 normpdf3v3(in float3 origin, in float sigma) { float x = 0.39894*exp(-0.5*origin.x*origin.x / (sigma*sigma)) / sigma; float y = 0.39894*exp(-0.5*origin.y*origin.y / (sigma*sigma)) / sigma; float z = 0.39894*exp(-0.5*origin.z*origin.z / (sigma*sigma)) / sigma; return float3(x, y, z); } float normpdf3(in float3 v, in float sigma) { return 0.39894*exp(-0.5*dot(v, v) / (sigma*sigma)) / sigma; } fixed4 frag(v2f i) : SV_Target { #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) i.uv.y = 1 - i.uv.y; #endif // sample the texture fixed4 col = tex2D(_MainTex, i.uv); float3 final_colour = float3(0.0, 0.0, 0.0); int kSize = (MSIZE - 1) / 2; float kernel[MSIZE]; float Z = 0.0; for (int j = 0; j <= kSize; ++j) { kernel[kSize + j] = kernel[kSize - j] = normpdf(float(j), _SIGMA); } float3 cc; float factor; float2 UV = i.uv; for (int i = -kSize; i <= kSize; ++i) { for (int j = -kSize; j <= kSize; ++j) { float2 newUV = (float2(UV)) + (float2(float(i), float(j)) / _MainTex_TexelSize.zw); cc = tex2D(_MainTex, newUV).rgb; factor = normpdf3(cc - col, _BSIGMA) * kernel[kSize + j] * kernel[kSize + i]; Z += factor; final_colour += factor*cc; } } // apply fog //UNITY_APPLY_FOG(i.fogCoord, col); return float4(final_colour / (Z), 1.0); } ENDCG } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" #define iResolution _ScreenParams struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float4 _MainTex_TexelSize; v2f vert(appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag(v2f i) : SV_Target { #if UNITY_UV_STARTS_AT_TOP if (_MainTex_TexelSize.y < 0) i.uv.y = 1 - i.uv.y; #endif // sample the texture fixed4 col = tex2D(_MainTex, i.uv); float2 uv = i.uv; float4 a = tex2D(_MainTex, float2(uv.x - 1.0 / iResolution.x, uv.y + 1.0 / iResolution.y)); float4 b = tex2D(_MainTex, float2(uv.x, uv.y + 1.0 / iResolution.y)); float4 c = tex2D(_MainTex, float2(uv.x + 1.0 / iResolution.x, uv.y + 1.0 / iResolution.y)); float4 d = tex2D(_MainTex, float2(uv.x - 1.0 / iResolution.x, uv.y)); float4 e = tex2D(_MainTex, float2(uv.x + 1.0 / iResolution.x, uv.y)); float4 f = tex2D(_MainTex, float2(uv.x - 1.0 / iResolution.x, uv.y - 1.0 / iResolution.y)); float4 g = tex2D(_MainTex, float2(uv.x, uv.y - 1.0 / iResolution.y)); float4 h = tex2D(_MainTex, float2(uv.x + 1.0 / iResolution.x, uv.y - 1.0 / iResolution.y)); float4 sobelX = a*(-1.0) + c*(1.0) + d*(-2.0) + e*(2.0) + f*(-1.0) + h*(1.0); float4 sobelY = a*(-1.0) + b*(-2.0) + c*(-1.0) + f*(1.0) + g*(2.0) + h*(1.0); col = sobelX + sobelY; // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag // make fog work #pragma multi_compile_fog #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; sampler2D _Bilateral; sampler2D _Canny; float4 _MainTex_ST; float _smoothDegree; float _Log; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 source = tex2D(_MainTex, i.uv); fixed4 bilateral = tex2D(_Bilateral, i.uv); fixed4 canny = tex2D(_Canny, i.uv); float4 smooth; float r = source.r; float g = source.g; float b = source.b; //if (canny.r < 0.2 && r> 0.3725 && g > 0.1568 && b > 0.0784 && r > b && (max(max(r, g), b) - min(min(r, g), b) > 0.0588 && abs(r - g) > 0.0588)) if(canny.r < 0.2 && r> 0.3725 && g > 0.1568 && b > 0.0784 && r > b && (max(max(r, g), b) - min(min(r, g), b) > 0.0588 && abs(r - g) > 0.0588)) { smooth = (1.0 - _smoothDegree) * (source - bilateral) + bilateral; } else { smooth = source; } smooth.r = log(1.0 + (0.2+ _Log) * smooth.r) / log(1.2+ _Log); smooth.g = log(1.0 + (0.2+ _Log) * smooth.g) / log(1.2+ _Log); smooth.b = log(1.0 + (0.2+ _Log) * smooth.b) / log(1.2+ _Log); //smooth = (1.0 - _smoothDegree) * (source - bilateral) + bilateral; // apply fog //UNITY_APPLY_FOG(i.fogCoord, smooth); return smooth; } ENDCG } } }