Archive 17/01/2023.

Toon Shader (GLSL)

rasteron

This is the version that I have originally discussed and posted a while back in this thread and appreciate all the versions that you have came up with guys! awesome :slight_smile:


Demo video below also includes Urho3D’s LOD feature.

…rough version so just tweak the parameters in the shader for variation.

Lumak

Awesome! Thank you for sharing this.

STeeL

Thanks for posting this shader.
HLSL:

#include "Uniforms.hlsl"
#include "Samplers.hlsl"
#include "Transform.hlsl"
#include "ScreenPos.hlsl"
#include "Lighting.hlsl"

void VS(float4 iPos : POSITION,
    out float2 oScreenPos : TEXCOORD0,
    out float4 oPos : OUTPOSITION) {	
  float4x3 modelMatrix = iModelMatrix;
  float3 worldPos = GetWorldPos(modelMatrix);
  oPos = GetClipPos(worldPos);
  oScreenPos = GetScreenPosPreDiv(oPos);
}

void PS(float2 iScreenPos: TEXCOORD0, out float4 oColor : OUTCOLOR0) {
  float ResS = 720.;
  float ResT = 720.;
  float MagTol = .5;
  float Quantize = 10.;
	
  float3 irgb = Sample2D(DiffMap, iScreenPos).rgb;
  float2 stp0 = float2(1./ResS, 0.);
  float2 st0p = float2(0., 1./ResT);
  float2 stpp = float2(1./ResS, 1./ResT);
  float2 stpm = float2(1./ResS, -1./ResT);
	
  float3 W = float3(0.2125, 0.7154, 0.0721);
  float i00 =   dot(Sample2D(DiffMap, iScreenPos).rgb, W);
  float im1m1 =	dot(Sample2D(DiffMap, iScreenPos-stpp).rgb, W);
  float ip1p1 = dot(Sample2D(DiffMap, iScreenPos+stpp).rgb, W);
  float im1p1 = dot(Sample2D(DiffMap, iScreenPos-stpm).rgb, W);
  float ip1m1 = dot(Sample2D(DiffMap, iScreenPos+stpm).rgb, W);
  float im10 = 	dot(Sample2D(DiffMap, iScreenPos-stp0).rgb, W);
  float ip10 = 	dot(Sample2D(DiffMap, iScreenPos+stp0).rgb, W);
  float i0m1 = 	dot(Sample2D(DiffMap, iScreenPos-st0p).rgb, W);
  float i0p1 = 	dot(Sample2D(DiffMap, iScreenPos+st0p).rgb, W);
	
  //H and V sobel filters
  float h = -1.*im1p1 - 2.*i0p1 - 1.*ip1p1 + 1.*im1m1 + 2.*i0m1 + 1.*ip1m1;
  float v = -1.*im1m1 - 2.*im10 - 1.*im1p1 + 1.*ip1m1 + 2.*ip10 + 1.*ip1p1;
  float mag = length(float2(h, v));
	
  if(mag > MagTol){
    oColor = float4(0., 0., 0., 1.);
  }else{
    irgb.rgb *= Quantize;
    irgb.rgb += float3(.5,.5,.5);
    int3 intrgb = int3(irgb.rgb);
    irgb.rgb = float3(intrgb)/Quantize;
    oColor = float4(irgb, 1.);
  }
}
rasteron

Sure thing STeel. Awesome work with the HLSL version, thanks for sharing.

Miegamicis

You guys are awesome! Will try this out myself!

rasteron

Great, hope you find it useful! :slight_smile: