3D Transformations

Shader code
// CC0, ElSuicio, 2025
// GODOT v4.4.1.stable
shader_type spatial;
render_mode ambient_light_disabled;
render_mode skip_vertex_transform;

#define TRANSLATION_MATRIX(t) mat4(\
	vec4(1, 0, 0, t.x),\
	vec4(0, 1, 0, t.y),\
	vec4(0, 0, 1, t.z),\
	vec4(0, 0, 0, 1)\
	);

#define ROTATION_MATRIX_X(a) mat4(\
	vec4(1, 0, 0, 0),\
	vec4(0, cos(a), -sin(a), 0),\
	vec4(0, sin(a),  cos(a), 0),\
	vec4(0, 0, 0, 1)\
	);
#define ROTATION_MATRIX_Y(b) mat4(\
	vec4( cos(b), 0, sin(b), 0),\
	vec4(0, 1, 0, 0),\
	vec4(-sin(b), 0, cos(b), 0),\
	vec4(0, 0, 0, 1)\
	);
#define ROTATION_MATRIX_Z(c) mat4(\
	vec4(cos(c), -sin(c), 0, 0),\
	vec4(sin(c),  cos(c), 0, 0),\
	vec4(0, 0, 1, 0),\
	vec4(0, 0, 0, 1)\
	);

#define ESCALATION_MATRIX(s) mat4(\
	vec4(s.x, 0, 0, 0),\
	vec4(0, s.y, 0, 0),\
	vec4(0, 0, s.z, 0),\
	vec4(0, 0, 0, 1)\
	);

group_uniforms _Transform;
uniform vec3 _Position = vec3(0.0);
uniform vec3 _Rotation = vec3(0.0);
uniform vec3 _Scale = vec3(1.0);

varying vec4 vertex_os;
varying vec4 normal_os;
varying vec4 binormal_os;
varying vec4 tangent_os;

varying vec3 color;

mat4 ROTATION_MATRIX(vec3 euler_angles_rad)
{
	mat4 x = ROTATION_MATRIX_X(euler_angles_rad.x)
	mat4 y = ROTATION_MATRIX_Y(euler_angles_rad.y)
	mat4 z = ROTATION_MATRIX_Z(euler_angles_rad.z)
	return y * x * z;
}

void vertex()
{
	/* 3D AXIS COLOR */
	color = normalize(NORMAL * NORMAL); // Axis in Object Space prev to 3D transform.
	
	/* ROTATION */
	vec3 angle_rad = radians(_Rotation);
	
	/* VERTEX */
	vertex_os = vec4(VERTEX, 1.0);
	
	vertex_os *= ESCALATION_MATRIX(_Scale)
	
	vertex_os *= ROTATION_MATRIX(angle_rad);
	
	vec4 vertex_ws = MODEL_MATRIX * vertex_os;
	
	vertex_ws *= TRANSLATION_MATRIX(_Position)
	
	vec4 vertex_vs = VIEW_MATRIX * vertex_ws;
	
	VERTEX = vertex_vs.xyz;
	
	/* NORMAL */
	normal_os = vec4(NORMAL, 0.0);
	
	normal_os *= ROTATION_MATRIX(angle_rad);
	
	vec4 normal_ws = MODEL_MATRIX * normal_os;
	
	vec4 normal_vs = VIEW_MATRIX * normal_ws;
	
	NORMAL = normalize(normal_vs.xyz);
	
	/* BINORMAL */
	binormal_os = vec4(BINORMAL, 0.0);
	
	binormal_os *= ROTATION_MATRIX(angle_rad);
	
	vec4 binormal_ws = MODEL_MATRIX * binormal_os;
	
	vec4 binormal_vs = VIEW_MATRIX * binormal_ws;
	
	BINORMAL = normalize(binormal_vs.xyz);
	
	/* TANGENT */
	tangent_os = vec4(TANGENT, 0.0);
	
	tangent_os *= ROTATION_MATRIX(angle_rad);
	
	vec4 tangent_ws = MODEL_MATRIX * tangent_os;
	
	vec4 tangent_vs = VIEW_MATRIX * tangent_ws;
	
	TANGENT = normalize(tangent_vs.xyz);
	
	/* PROJECTION */
	vec4 vertex_proj = PROJECTION_MATRIX * vertex_vs;
	
	POSITION = vertex_proj;
}

void fragment() 
{
	ALBEDO = color;
}
Live Preview
Tags
3d, rotation, scale, Transform, Translation
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 ElSuicio

guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments