PS1/PSX Model
Usage
- Add a new
ShaderMaterial
in the 3D model - In the
ShaderMaterial
add a newShader
- 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;
}
it’s already written in the description, but here’s another reminder: this shader is intended a primary material as a ShaderMaterial3D resource. place your Albedo as the Shader parameter instead of a StandardMaterial3D with the shader as a second pass.
if you’re having issues with your Albedo flickering white or black, double-check that.
Excellent work, thank you!
can you control the affine mapping because it freaks out a lot more than i want.
[…] started in Godot 4.2.2) Programming: me 3D modeling, texturing, animation and artwork: me Shaders: PS1/PSX model VHS with wiggle Addons used: Godot Texture […]
[…] in Godot 4.2.2) Programming: me 3D modeling, texturing, animation and artwork: me Shaders used: PS1/PSX model VHS with wiggle Addons used: Godot Texture Fonts Phantom […]
how to use this with next pass?
i want to set albedo from primary shader material