PS1/PSX Model

Usage

  1. Add a new ShaderMaterial in the 3D model
  2. In the ShaderMaterial add a new Shader
  3. Copy the script below into the Shader-Editor.

Documentation

  • affine_mapping: Normalizes the vertices if true.
  • albedo: Texture that will be used for this model.
  • alpha scissor: Threshold when the alpha value will be not rendered.
  • jitter: Amount of jitter that will be used. Higher values result in more jitter.
  • resolution: The screen resolution that will be used to apply the jitter

Hint

This shader is written for Godot 4.

Shader code
shader_type spatial;
render_mode blend_mix,
	cull_disabled,
	depth_prepass_alpha,
	shadows_disabled,
	specular_disabled,
	vertex_lighting;

uniform bool affine_mapping = false;
uniform sampler2D albedo : source_color, filter_nearest;
uniform float alpha_scissor : hint_range(0, 1) = 0.5;
uniform float jitter: hint_range(0, 1) = 0.25;
uniform ivec2 resolution = ivec2(320, 240);

vec4 snap_to_position(vec4 base_position)
{
	vec4 snapped_position = base_position;
	snapped_position.xyz = base_position.xyz / base_position.w;
	
	vec2 snap_resulotion = floor(vec2(resolution) * (1.0 - jitter));
	snapped_position.x = floor(snap_resulotion.x * snapped_position.x) / snap_resulotion.x;
	snapped_position.y = floor(snap_resulotion.y * snapped_position.y) / snap_resulotion.y;
	
	snapped_position.xyz *= base_position.w;
	return snapped_position;
}

void vertex()
{
	vec4 snapped_position = snap_to_position(PROJECTION_MATRIX * MODELVIEW_MATRIX * vec4(VERTEX, 1.0));
	if (affine_mapping)
	{
		POSITION = snapped_position;
		POSITION /= abs(POSITION.w);
	}
	else
	{
		POSITION = snapped_position;
	}
}

void fragment()
{
	vec4 color_base = COLOR;
	vec4 texture_color = texture(albedo, UV);

	ALBEDO = (color_base * texture_color).rgb;
	ALPHA = texture_color.a * color_base.a;
	ALPHA_SCISSOR_THRESHOLD = alpha_scissor;
}
Tags
godot4, lowpoly, ps1, psx, retro
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 Grau

Gameboy Look

PS1/PSX PostProcessing

Related shaders

PS1/PSX PostProcessing

First Person View Model Shader

PSX Shader with Vertex Lighting

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments