Transparent Lightweight GLSL Shaders for Wayland (Hypr Focused) C++

While customizing my desktop with fun little overlays using Hyprwinwrap, I thought it would be really cool to display shaders on top of my wallpaper. After trying and failing to find an existing program that would suit my needs, a new project idea was born.

  • Lightweight – nothing except the shader rendering engine and bare necessities
  • Customizable – load custom shaders and settings from disk without recompiling
  • Wayland compatible transparency – I should be able to see through the rendered window if the shader outputs an alpha below 1.0
  • Modern GLSL compatible
  • Ability to externally set window class for use with Hyprwinwrap so we can layer it on top of our desktop

My current live wallpaper setup without wayshaders:

https://motionbgs.com/solitary-reflection

And with a nice star shader:

Awesome, but maybe you want something more “interesting”.
Here’s a ShaderToy converted shader called Eon:

I realized early in the project most of the fun ShaderToy projects use layering with iChannels and more than one shader. This program uses a similar structure so it’s possible to achieve advanced effects.

Cellular automata simulation

For instance, put a file named “shader0.frag/shader0.vert” next to wayshader for a basic one shader setup. If you need multipass rendering on that one shader, simply insert uniform sampler2D u_sampler0 as a variable. u_sampler0 will then contain a reference to last frame’s buffer so you can make trails, transformations, etc.

Want another layer? Easy. Add “shader1.frag/shader1.vert” next to the program. This shader will be rendered as its own pass on top of the previous shader.

The u_sampler variables are mapped to each shader’s index; u_sampler0 is always a reference to shader0‘s buffer. shader1 has access to u_sampler1, which is a reference to its own buffer. shader2 will have access to u_sampler0, u_sampler1, and u_sampler2 (its own buffer). Supports up to 32 “channels” with the same pattern.

It also provides basic inputs in the form of u_resolution, u_time, and u_frame.

Pull requests and feedback are always welcomed.


It helps me if you share this post

Published 2026-01-30 20:06:06

Leave a Reply

Your email address will not be published. Required fields are marked *