Pixel Perfect outline Shader

Uploading this because couldn’t find one on this site.

Same outline size from any distance, perfect for interactable objects.
Mode for Godot 4.

To use in Godot 3 replace “source_color” with “hint_color”

Shader code
shader_type spatial;
render_mode cull_front, unshaded;

uniform vec4 outline_color : source_color;
uniform float outline_width = 1.0;

void vertex() {
	vec4 clip_position = PROJECTION_MATRIX * (MODELVIEW_MATRIX * vec4(VERTEX, 1.0));
	vec3 clip_normal = mat3(PROJECTION_MATRIX) * (mat3(MODELVIEW_MATRIX) * NORMAL);
	
	vec2 offset = normalize(clip_normal.xy) / VIEWPORT_SIZE * clip_position.w * outline_width * 2.0;
	
	clip_position.xy += offset;
	
	POSITION = clip_position;
}

void fragment() {
	ALBEDO = outline_color.rgb;
	if (outline_color.a < 1.0) {
		ALPHA = outline_color.a;
	}
}
Tags
outline, pixel perfect outline
The shader code and all code snippets in this post are under CC0 license and can be used freely without the author's permission. Images and videos, and assets depicted in those, do not fall under this license. For more info, see our License terms.

More from axilirate

Stylized Sky Shader With Clouds For Godot 4

Speed Lines Shader for Godot 4

Simple Ellipse Shader

Related shaders

Clean pixel perfect outline via material

Pixel Perfect Sprite Stacking Edges in 3D

3D Pixel art outline/highlight Shader (Old)

Subscribe
Notify of
guest

12 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Master35
Master35
1 year ago

thanks

Tanders
1 year ago

Looks really nice, but I can’t seem to get it working. On a simple cube there is gaps between the corners, any idea why this may be? I’m using Godot v4.0.beta1

ApeSander
ApeSander
1 year ago
Reply to  Tanders

I have the same problem

user123
user123
1 year ago
Reply to  ApeSander

It only works on mesh with smoothed normals.

Last edited 1 year ago by user123
FreyaArtoria
6 months ago
Reply to  ApeSander

I was able to get this working by making a shader with this (as a material) set on the “next pass” after a generic blank material – it renders the base material, and then the outline over it.

Yuri
Yuri
5 months ago
Reply to  FreyaArtoria

Cheers, this helped

AndreaTerenz
13 days ago
Reply to  FreyaArtoria

doesn’t seem to fix the gaps for me, what version of Godot are you using?

Kevin Fajardo
Kevin Fajardo
2 days ago
Reply to  FreyaArtoria

Thank you! It seems that settiing it in Geometry -> Material Overlay works too

hidemat
hidemat
1 year ago

Oh this one just works! Thanks!

BadWithie
BadWithie
8 months ago

thanks

Last edited 8 months ago by BadWithie
hello
hello
4 months ago

thank

Nix
Nix
4 months ago

I love u