X-ray Vision Effect

This is a shader for an x-ray vision effect to let you see a model through other objects.

This effect requires a little bit of setup before it works in projects. The steps are as follows:

  1. Create a new shader material with this shader.
  2. Add the desired “normal” material as the “Next Pass”.
  3. Make sure the added “normal” material has a render priority of 1.

I would suggest tweaking the settings until you get an effect you like before adding the Next Pass material for ease of use.

This version of the shader includes a variety of toggles to customize the theme based on your project.

Much of this code is adapted from SciFi hologram by KubikPixel (https://godotshaders.com/shader/scifi-hologram/)

The provided shader code is consolidated from the effects in the video and is intended for experimentation and is therefore not optimized for performance.

Shader code
/* -----------------
X-ray shader by Michael Watt
Thanks to KubikPixel for the SciFi Hologram shader on which much of this code is based, and GDQuest for the demo scene I used for troubleshooting.

This is the consolidation of the x-ray shaders shown in the video:
	https://youtu.be/seIYhuF6Tdk

Please note that this shader is designed for experimentation, and is 
therefore not optimized for performance.

MIT License
----------------- */ 

shader_type spatial;
render_mode unshaded, depth_test_disable;

// Options for testing different effects
uniform bool enable_glow = false;
uniform bool enable_lines = false;
uniform bool enable_flicker = false;
uniform bool enable_pattern = false;

// Used for Magic and SciFi effects
uniform mediump vec4 base_color : hint_color = vec4(0.0, 1.0, 0.0, 1.0);
uniform mediump vec4 glow_color : hint_color = vec4(0.5, 0.75, 1.0, 1.0);
uniform lowp float glow_itensity : hint_range(0, 20) = 4.5;
uniform lowp float glow_amount : hint_range(0, 20) = 4.5;

// Used for SciFi effect
uniform lowp float flickering : hint_range(0, 1) = 0.55;
uniform sampler2D static_texture;
uniform mediump float line_width : hint_range(0, 1) = 0.005;
uniform mediump float line_blur : hint_range(0, 1) = 0.2;
uniform mediump float line_speed : hint_range(-1, 1) = 0.02;
uniform  bool straight_lines = true;
uniform mediump float interrupt_width : hint_range(0, 1) = 0.5;
uniform mediump float interrupt_blur : hint_range(0, 1) = 0.25;
uniform mediump float interrupt_speed : hint_range(-1, 1) = 0.2;

// Used for Pattern effect
uniform sampler2D pattern_texture;

//Note: higher amount values result in a thinner line
vec3 fresnel_glow(float amount, float intensity, vec3 color, vec3 normal, vec3 view) {
	return pow((1.0 - dot(normalize(normal), normalize(view))), amount) * color * intensity;
}

void fragment () {
	vec2 canvas;
	if (straight_lines) {
			canvas = SCREEN_UV;
	} else {
		canvas = vec2(VIEW.x, VIEW.y);
	}
	vec2 lines = vec2(clamp(sin((TIME * line_speed + canvas.y) / line_width), line_blur, 1.0 - line_blur), canvas.x);
	vec2 interupts = vec2(clamp(sin((TIME * interrupt_speed + canvas.y) / interrupt_width * 3.0), interrupt_blur, 1.0 - interrupt_blur), canvas.x);
	
	float flicker;
	if (enable_flicker){
		flicker = clamp(fract(cos(TIME) * 43758.5453123), flickering, 1.0);
	} else {
		flicker = 1.0;
	}
	
	vec4 imgtex;
	if(enable_pattern) {
		imgtex = texture(pattern_texture, SCREEN_UV);
	} else {
		imgtex = base_color;
	}
	
	imgtex *= flicker * texture(static_texture, lines * interupts);
	vec3 imgtex_color = vec3(imgtex.r, imgtex.g, imgtex.b);
	
	ALBEDO = imgtex_color;
	
	if(enable_glow)
	{
		vec3 fresnel_color = vec3(glow_color.r, glow_color.g, glow_color.b);
		vec3 fresnel = fresnel_glow(glow_amount, glow_itensity, fresnel_color, NORMAL, VIEW);
		ALBEDO += fresnel;
	}
	
	EMISSION = glow_amount * vec3(glow_color.r, glow_color.g, glow_color.b);
	
	if(enable_lines)
		ALPHA = lines.x * interupts.x;
}
Tags
behind, Magic, sci-fi, scifi, x ray, xray
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.

More from Watt Interactive

Shaped Glow Post-Processing Effect

Quick Example Fresnel Outline

Sci-Fi Scanner Pulse (Godot 3.5)

Related shaders

Ray Marching Lava Lamp

Ray-box setup

Ray-traced sphere for particle effects

Subscribe
Notify of
guest

3 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Julian
2 years ago

Oh wow really useful!

dude
dude
7 months ago

can this work for 2D?

Danikakes
Danikakes
8 days ago

This is amazing! Is there a way for this to work in 4+?