Item Highlighter

How to use:

Add shader to Next Pass in the Surface Material of the MeshInstance

In Godot 4:

Change  hint_color to source_color and CAMERA_MATRIX to INV_VIEW_MATRIX.

 

Shader code
shader_type spatial;
render_mode unshaded, depth_draw_never;

uniform vec4 shine_color : hint_color = vec4( 1.0, 1.0, 1.0, 1.0 );
uniform float cycle_interval : hint_range(0.5, 5.0) = 1.0;
uniform float shine_speed : hint_range(1.0, 5.0) = 3.0;
uniform float shine_width : hint_range(1.0, 100.0) = 3.0;

void fragment( )
{
	vec3 vertex = ( CAMERA_MATRIX * vec4( VERTEX, 1.0 ) ).xyz;
	float width = shine_width * 0.001 * cycle_interval;
	float frequency = floor( sin( vertex.z * cycle_interval + TIME * shine_speed * cycle_interval ) + width );
	ALBEDO = shine_color.rgb;
	ALPHA = clamp( ( 1.0 - dot( NORMAL, VIEW ) ) * frequency * shine_color.a, 0.0, 1.0 );
}
Tags
collectable, glint, highlight, item, shine
The shader code and all code snippets in this post are under MIT license and can be used freely. Images and videos, and assets depicted in those, do not fall under this license. For more info, see our License terms.

Related shaders

3D Item Highlighter (with Angle Adjustment!)

2D Item Highlight Shader

Subscribe
Notify of
guest

9 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
matsakis27
matsakis27
2 years ago

It would be amazing if there was a 2D version of this <3

GammaGames
2 years ago
Reply to  matsakis27

I went looking and found something similar, uploaded it to the site: https://godotshaders.com/shader/2d-shine-highlight/?post_id=3807

BlackDragonBE
BlackDragonBE
2 months ago
Reply to  matsakis27
Jimbow
2 years ago

I love this so much!

MikeCodev
MikeCodev
1 year ago

For it to work in Godot 4 you need to do two little adjustments:

Change hint_color to source_color and CAMERA_MATRIX to VIEW_MATRIX

shader_type spatial;
render_mode unshaded, depth_draw_never;

uniform vec4 shine_color : source_color = vec4( 1.0, 1.0, 1.0, 1.0 );
uniform float cycle_interval : hint_range(0.5, 5.0) = 1.0;
uniform float shine_speed : hint_range(1.0, 5.0) = 3.0;
uniform float shine_width : hint_range(1.0, 100.0) = 3.0;

void fragment( )
{
    vec3 vertex = ( VIEW_MATRIX * vec4( VERTEX, 1.0 ) ).xyz;
    float width = shine_width * 0.001 * cycle_interval;
    float frequency = floor( sin( vertex.z * cycle_interval + TIME * shine_speed * cycle_interval ) + width );
    ALBEDO = shine_color.rgb;
    ALPHA = clamp( ( 1.0 - dot( NORMAL, VIEW ) ) * frequency * shine_color.a, 0.0, 1.0 );
}
Mark B
Mark B
1 year ago
Reply to  MikeCodev

CAMERA_MATRIX was renamed INV_VIEW_MATRIX not VIEW_MATRIX 🙂

https://github.com/godotengine/godot/pull/59268

Zain
Zain
9 months ago

Is there a way to change the angle of the shine?

Stef
Stef
7 months ago

Is it possible to use it on a Sprite3D?

jasonheh
jasonheh
6 months ago

I really like this effect, but because you use the view transform on the vertices, if you are rotating the camera while the effect is playing it has a strange behavior (very rapid oscillations). Changing it to just use VERTEX directly seems to work better for me.

So you can just change the first line to:

vec3 vertex = VERTEX.xyz;