Horri-Fi is a simple and easy-to-use Shader for Game Maker Studio 2! Setup is as simple as calling:


and then applying it to your surface:

draw_surface(application_surface, 0, 0);

  Thats it!

This shader includes:

  • Bloom
  • Chromatic Abberation
  • Scanlines
  • VHS Distortion
  • CRT TV Curve
  • Noise
  • Vignette

You can dynamically set any of the shader values using the 


functions such as:


The demo above is also included as an EXE file that you can run, adjust settings, and press the "Copy GML code to clipboard" button and paste in your game!!

Using Defold? Check out TheKing0x9 port of this shader for defold here!

Rated 4.9 out of 5 stars
(8 total ratings)
Made withGameMaker
Tags2D, 3D, Creepy, GameMaker, Horror, Lo-fi, post-processing, Spooky, vfx


Download NowName your own price

Click download now to get access to the following files: 9 MB

Development log


Log in with to leave a comment.


Hey, not sure if you still read the comments but I really appreciate you sharing this shader for free. This is probably the most simple to use shader I have ever come across. It was a simple drag and drop and it worked in my game without any problems. Thanks a lot!


Thank you so much! :) i hope it is useful!!

amazing work thanks dude!

Thank you!! :D


Why does 'draw_surface(application_surface, 0, 0);' make all my gui elements transparent?

it could be that this code is running after all of your GUI elements (e.g. the object drawing the application surface runs its GUI draw event after the other GUI elements). You can try to place this instead in the "GUI Begin" event or setting this object to a higher depth / lower layer I believe. 

Hope this helps. :)

Another quick question, is there anyway to make the bloom not grainy?


It uses a rotational sample blur instead of a box/gaussian blur. This was mostly done for performance reasons as sample blurring is more efficient and also fit the 'aesthetic' of the project. You can replace the shader code for the `blur()` function in the `shd_horrifi` fragment shader to another method of blurring if you would like. :) If you are looking for a more general purpose post processing shader, however, I would recommend FoxyOfJungle's Post Processing FX instead, as it will offer what horrifi does and MUCH MUCH more with better results. :)

I Hope this helps!

Do you think this could be converted to GMS1? Since not everyone uses GMS2. I personally can't since I don't really have any sustainable money to keep paying the subscription-based model. Really hate that they switched to subs. I'm really only interested in the vignette shader. :(

You can just copy over the shader yes. It should work fine with 1. You will just need to set up the uniforms yourself. :) You can also check out this Vignette shader on shader toy and copy it over. You just need to make a few changes. Vignette is pretty easy to make work.

It isnt subscription based anymore and luckily they changed it back so you can do a one time purchase.

(1 edit)

Yeah I use GMS2.3 now that it's free(for non-commercial use)! Happy I can finally utilize awesome assets like Input, Scribble, Horror-Fi, and many more! Best decision YoYo Games made in recent years.

Absolutely! Also check out Post Processing FX by FoxyOfJungle. It's quite literally one of the best post processing assets out there, even more so than a lot of Unity and Unreal assets, and it's only available for GM! :)

I would, but damn is that a hefty price tag for a bunch of shaders. No thanks. Good for him tho

Such an awesome shader! Easy to import, use and customize, perfect for poor silly devs like me which can't grasp the cool sorcery that shaders are.

I'm currently trying out Horri-fi on a 3d game and I'm having trouble drawing GUI text (looks like the culling mode is affecting the shader). Is there some specific stuff I need to know when using Horri-fi in a 3d environment?

Again, kudos to you and thanks for sharing your knowledge with everyone!

Hey thanks! :)

Uhm, no it should work fine, so long as you are making sure to reset your matrix and shader in the draw events. If you think it's the culling, turn culling to cull_noculling in the beginning of the gui and then turn it back on after your gui code. 

Hope this helps! :)


Thanks for replying, I was sure it was something I did, but preferred to ask nonetheless just to be sure.

Again, thanks a lot! Horri-fi is great!

Hi Gizmo199! This shader is really cool but I'm having some issues implementing it into my game. I followed the steps you have listed on itch but I keep getting errors and all the lines of code are highlighted yellow (being unused). I put all the code in my game_control objects so the shader is applied to the application

After digging around I noticed you have 3 text files in the folders

- lib_horrifi

- shd_horrifi_fragment

- shd_horrifi_vertex

I can assume these were examples of projects but after looking at them, I can see they have code that makes the variables work. Am I supposed to plug these in? 

I'm not very experienced with shaders so i'm probaly doing a simple mistake, is there any way you can help me out?



action number 1

of Create Event

for object o_game:

Variable <unknown_object>.horrifi_enable(100139, -2147483648) not set before reading it.

 at gml_Object_o_game_Create_0 (line 4) - horrifi_enable(true);


gml_Object_o_game_Create_0 (line 4)

hey! So the horrifi_fragment and horrifi_vertex are the code you would put into a new shader. Then you would just put the lib_horrifi code into a blank script and use the horrify_* functions. the unknown object should be the global.__horriFi variable. I would recommend dragging and dropping the .yymps file into your game and adding the lib_horrifi script and the shd_horrifi shader.

Is it possible to attach these effects to single objects, and not the whole scene?

absolutely! It's just a shader so you can treat it as you would any other shader. My example just shows it used on the application surfaces since it was designed with 'post processing' in mind, but it can be used for anything you want! You just might need to go into the scripts and copy some things for use outside of the functions I have provided. :)


Hi! I have a question, so when I tried this project out it seems like my characters can appear over the scan lines which is weird, like its not affected by the shader for some reason, I simply used the example code. What could be the issue here?


Ok nevermind, turns out I just have to read more carefully,  I did not use draw gui for this,

haha. No worries! Yeah, its just a standard shader protocol. So you can even use Horrifi on individual sprites if you wanted! The GUI just makes it so that you an apply it to the entirety of the application surface. You could also set it as a 'layer script begin/end' for the layer you have all of your instances being drawn if you want as well. Totally up to you! :D I am glad you figured it out! :)



is there a way to limit/ clamp the effect of the shader ? I am trying to figure it out and cant seem to find it. I would like to adjust it so it wont cover the whole camera view but a desire area.

hey! That would come more to either applying the application surface to a separate surface and then using 'draw_surface_part' or just applying horrifi to the specific thing you want to use it on. Horrifi can even be applied to sprites! Just use 

draw_sprte(sprite, index, x, y);


Thanks a lot for this awesome shader. Amazed by the functionality it offers, I ported this shader over to Defold. Please check it out and let me know if I gave you proper credit, or is there something more you’d like to be added.

GitHub :

Thanks again :)


thats sick! Great work! I have been looking for a better CRT so I might have to update mine! Are you okay if I put a link to your repo on this page? Great work, very cool!!


Thanks!! Adding a link to either GitHub or Itch( will be cool with me! Thanks again for this awesome shader!


the .yymps file format is invalid for me. is that where the "render" object is? is there something i'm missing? can't figure out how to get this into my game.


Strange! Are you using an older version of GM? Either way there should be a vertex/fragment shader text file as well as a GML code text file that you can simple copy and paste into your game. You can also find the copy/paste code here as well! Hope that helps! :)

should I paste it into an object or a script?


paste the gml code into a general script, and post the shader codes in a shader. The shader should be named 'shd_horrifi'. Then just follow the above examples for setting it up. :)


Gizmo delivering something awesome once again. How can you not love him?

Aw thanks! 🥰


this works beautifully for class project. i do need to know what license or permissions it has.

(2 edits)

license is included in the project files. ;) free to use MIT


The best plug and play asset I have ever used for gamemaker. It just works and very simple. The effects are all amazing and stuff I've always wanted to include in projects but couldn't figure out. Thanks for your fine work!

yay! Glad it was of use! :D

(1 edit) (+1)

Quick question, I've noticed that the image doubles in size when applying this shader, resizing the application surface down to half the resolution I normally have it at works, but the image quality degrades a bit. Any idea why this might be happening? 

EDIT: Nevermind, I realised that the automatic drawing of the application surface was disabled in the create event, so halfing the scale there worked perfectly. Thanks again!

Glad you figured it out! :) yeah resolution stuff wont be effect by this system. You could apply this shader to a single sprite and it would work (though you'd wanna go into global.__horriFi > render() function and get the correct texture/texel size).


Looks cool.


I loved it, very simple to implement! 10/10

Yay! Thanks! :D

(1 edit) (+1)

Wow!  This looks great.  Can the effect be used on individual objects rather than the whole surface?

(1 edit)

Absolutely! Though you might have to go into the gml code and tweak some stuff for the bloom effect. It takes in the texel size of the application surface, but if you go into global.__horriFi.render() you will see where I am setting that and you can change it if you wish! :)


This looks great!! Would it be okay to add this to a paid product, and if so how would you like to be credited?


absolutely! There is an included license for free use to distribute/alter the code as you please. :) no credit required but it is much appreciated!! :)


Looks great! I'll definitely keep this one in mind when I do another horror game! Thanks, Gizmo199

Thanks! I hope it is useful! :D


another classic to add to the gms collection

Thanks so much!! I hope it will be of use to you! :D