Unity shader for rendering sketch style

Time:2020-10-29

In this paper, we share the specific code of unity shader to achieve sketch style for your reference. The specific content is as follows

principle

Six sketch textures are used for rendering. In the rendering stage, the illumination per vertex is calculated in the vertex shading stage. The blending weights of the six textures are determined according to the lighting results, and are transferred to the slice shader. In the slice shader, the sampling results of 6 textures are mixed according to these weights

Shader implementation

Shader "Hatching" 
{
 Properties {
 A kind of Color ("color tint", color) = (1, 1, 1) // color
 A kind of Tilefactor ("tile factor", float) = 1 // tiling coefficient of texture. The larger the value, the denser the sketch lines
 _Outline ("Outline", Range(0, 1)) = 0.1
 _Hatch0 ("Hatch 0", 2D) = "white" {}
 _Hatch1 ("Hatch 1", 2D) = "white" {}
 _Hatch2 ("Hatch 2", 2D) = "white" {}
 _Hatch3 ("Hatch 3", 2D) = "white" {}
 _Hatch4 ("Hatch 4", 2D) = "white" {}
 A kind of Hatch5 ("hatch 5", 2D) = "white" {} // corresponding to 6 sketch textures
 }
 
 SubShader {
 Tags { "RenderType"="Opaque" "Queue"="Geometry"}
 
 
 Pass {
 Tags { "LightMode"="ForwardBase" }
 
 CGPROGRAM
 
 #pragma vertex vert
 #pragma fragment frag 
 
 #pragma multi_compile_fwdbase
 
 #include "UnityCG.cginc"
 #include "Lighting.cginc"
 #include "AutoLight.cginc"
 #include "UnityShaderVariables.cginc"
 
 fixed4 _Color;
 float _TileFactor;
 sampler2D _Hatch0;
 sampler2D _Hatch1;
 sampler2D _Hatch2;
 sampler2D _Hatch3;
 sampler2D _Hatch4;
 sampler2D _Hatch5;
 
 struct a2v {
 float4 vertex : POSITION;
 float4 tangent : TANGENT; 
 float3 normal : NORMAL; 
 float2 texcoord : TEXCOORD0; 
 };
 
 struct v2f {
 float4 pos : SV_POSITION;
 float2 uv : TEXCOORD0;
 fixed3 hatchWeights0 : TEXCOORD1;//
 Fixed3 hatchweights1: texcoord2; // there are 6 mixed weights in two fixed3 variables
 float3 worldPos : TEXCOORD3;
 SHADOW_COORDS(4)
 };
 
 v2f vert(a2v v) {
 v2f o;
 
 o.pos = UnityObjectToClipPos(v.vertex);
 
 o.uv = v.texcoord.xy * _TileFactor;
 
 fixed3 worldLightDir = normalize(WorldSpaceLightDir(v.vertex));
 fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
 Fixed diff = max (0, dot (worldlightdir, worldnormal)); // diffuse reflection coefficient
 
 o.hatchWeights0 = fixed3(0, 0, 0);
 o.hatchWeights1 = fixed3(0, 0, 0);
 
 Float hatchfactor = diff * 7.0; // Zoom diff to [0,7]
 
 //Pure white
 if (hatchFactor > 6.0) 
 {
 
 } else if (hatchFactor > 5.0) {
  o.hatchWeights0.x = hatchFactor - 5.0;
 } else if (hatchFactor > 4.0) {
  o.hatchWeights0.x = hatchFactor - 4.0;
  o.hatchWeights0.y = 1.0 - o.hatchWeights0.x;
 } else if (hatchFactor > 3.0) {
  o.hatchWeights0.y = hatchFactor - 3.0;
  o.hatchWeights0.z = 1.0 - o.hatchWeights0.y;
 } else if (hatchFactor > 2.0) {
  o.hatchWeights0.z = hatchFactor - 2.0;
  o.hatchWeights1.x = 1.0 - o.hatchWeights0.z;
 } else if (hatchFactor > 1.0) {
  o.hatchWeights1.x = hatchFactor - 1.0;
  o.hatchWeights1.y = 1.0 - o.hatchWeights1.x;
 } else {
  o.hatchWeights1.y = hatchFactor;
  o.hatchWeights1.z = 1.0 - o.hatchWeights1.y;
 }
 
 o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
 
 TRANSFER_SHADOW(o);
 
 return o; 
 }
 
 fixed4 frag(v2f i) : SV_Target 
 {// samples according to the corresponding weight
 fixed4 hatchTex0 = tex2D(_Hatch0, i.uv) * i.hatchWeights0.x;
 fixed4 hatchTex1 = tex2D(_Hatch1, i.uv) * i.hatchWeights0.y;
 fixed4 hatchTex2 = tex2D(_Hatch2, i.uv) * i.hatchWeights0.z;
 fixed4 hatchTex3 = tex2D(_Hatch3, i.uv) * i.hatchWeights1.x;
 fixed4 hatchTex4 = tex2D(_Hatch4, i.uv) * i.hatchWeights1.y;
 fixed4 hatchTex5 = tex2D(_Hatch5, i.uv) * i.hatchWeights1.z;
 fixed4 whiteColor = fixed4(1, 1, 1, 1) * (1 - i.hatchWeights0.x - i.hatchWeights0.y - i.hatchWeights0.z - 
  i.hatchWeights1.x - i.hatchWeights1.y - i.hatchWeights1.z);
 
 fixed4 hatchColor = hatchTex0 + hatchTex1 + hatchTex2 + hatchTex3 + hatchTex4 + hatchTex5 + whiteColor;
 
 UNITY_LIGHT_ATTENUATION(atten, i, i.worldPos);
  
 return fixed4(hatchColor.rgb * _Color.rgb * atten, 1.0);
 }
 
 ENDCG
 }
 }
 FallBack "Diffuse"
}

The results are as follows:

The above is the whole content of this article, I hope to help you in your study, and I hope you can support developeppaer more.