Files
aego/engine/res/shaders/materials/pixelsnap.aeshader
sanspie 5eb1832907
ci-platforms / darwin amd64 smoke (push) Skipped
ci / build (amd64, linux, ubuntu-24.04) (push) Failing after 15m28s
ci / release (push) Skipped
ci-platforms / windows amd64 smoke (push) Skipped
ci-platforms / darwin arm64 smoke (push) Skipped
ci / checks (push) Successful in 7m47s
Complete Stage 12 for v0.12.0
2026-11-05 11:46:53 +03:00

26 lines
1.1 KiB
Plaintext

#pragma aego abi 1
#pragma domain sprite
#include "engine/sprite.glsl"
#pragma material
uniform float GridPixels; // @default(1) @range(1, 32) @unit("physical pixels")
uniform float Strength; // @instance @default(1) @range(0, 1)
uniform float Opacity; // @instance @default(1) @range(0, 1)
#pragma end
void vertex() {
vec4 clip = aego_view_proj * vec4(aego_world, 1.0);
vec2 size = max(aego_viewport.zw, vec2(1.0));
// Viewport is already measured in physical target pixels, including DPR and
// offscreen render scale. Applying aego_pixel_scale again would double it.
vec2 direction = vec2(1.0, aego_clip_to_pixel_y < 0.0 ? -1.0 : 1.0);
vec2 pixel = (clip.xy / clip.w * direction * 0.5 + 0.5) * size + aego_viewport.xy;
float grid = max(GridPixels, 1.0);
vec2 snapped = floor(pixel / grid + 0.5) * grid;
pixel = mix(pixel, snapped, clamp(Strength, 0.0, 1.0));
clip.xy = ((pixel - aego_viewport.xy) / size * 2.0 - 1.0) * direction * clip.w;
vec4 world = inverse(aego_view_proj) * clip;
aego_world = world.xyz / world.w;
}
void fragment() {
aego_out = aego_sample() * clamp(Opacity, 0.0, 1.0);
}