Canberk Yücekök has shared a short breakdown explaining the creation process behind the recently-released UE5-powered graffiti generator.
My name is Canberk Yücekök, I am a Generalist in the games industry at a Studio called Metavision from Turkey. As a generalist, I always try to keep myself involved in side projects in order not to exhaust my mind with the same task for long periods of time. If I am given a task in the studio, I try to pick something from a different field to keep me distracted, in a constructive way of course.
For the last couple of months, I have been working with Unreal Engine’s Procedural Content Generator, which is something relatively recent. For that reason, I spend lots of time doing research and testing and as much as it is enjoyable, it is also tiresome at times. So I needed something I was already trained in and something to make it happen right off the bat.
One of the earliest works I did for the studio was a graffiti weapon skin for a FPS game called Sabotaj. I already had some practice from that time. And as I was also working on procedural systems, I thought it would be handy to make a graffiti generator tool. It sounded like fun and achievable in a short time. In the end, I can say it took me around 3-4 months of my free time to finish this project.
I wanted to keep it simple and not complicate things from the start. Because as a person who is always struggling to rap up my projects, I try to set realistic goals by carefully calculating how much time I can spend on it and also how much time I have before my brilliant idea, in the beginning, becomes so banal that I can even bare to look at it for one more second. So I had to make it quick.
My Humble 70/30 Rule
I always try to convince myself of this rule before I start anything: “This is going to be around 70 percent of what I am imagining it to be right now. Make peace with it and get to work.” Of course, It can end up being much better, but it is always better to keep your expectations around there. This at least psychologically helps me publish things, everything can get better, and we can always have new things to be added, but we have to stop somewhere. Someone else’s work might look perfect to you and might even look like that person hit that 100 percent with their work, and there is nothing to be improved in their work, but believe me, it is 70 percent of their vision.
I started searching for urban city pictures, graffiti archives, and collections, the best graffiti works, etc. The problem I had during reference gathering was at one point, even though it was giving me the best results, Pinterest started showing me similar results no matter what I tried. (Please bear in mind that the initial reason I chose this project was to avoid too much research.) So one lesson I had was not to stick with one resource if you want to achieve variety. Flickr was also very good. My reference board was changing constantly, references were in and out on a daily basis.
The basic idea was to create a mask in RGBA channels of a single texture for each alphabet letter. The red channel is the outline mask, the green channel is the fill inside the letter, the blue is the thickness fill and the alpha channel is the outer parts of the texture. After that, I created a simple master material and started testing very early. I always try to test as early as possible, it is sort of a proof of concept for myself.
Customization For the Sake of Complication
After this point, I was crafting the material more and more, adding parameters to the material for customization. A note here: Sertaç Ogan, a very precious colleague, one of those whom you are grateful for working with; advised me not to add too many controls as it will make it very hard to use and comprehend for the user. It should be customizable but should not take away the fun and comfort. Wise words indeed, so I tried to keep it organized and keep everything user-friendly.
The Technical Side of an Artistic Tool
The creation process was straightforward; no wizardry whatsoever was required. Create letter masks, separate its elements in color channels as masks, create an actor to call and spawn each individual letter when called; adjust the scale, offset, different color, and mask variables. After I separate mask elements I make simple fill and blend operations. Once everything was coming together, I think we all had the feeling of spicing it up a little. I think it is because it is the last chance before we seal the design. Anyway, the problem I had was performance related. Calling upon a different 2k texture for each letter, plus various different textures for design purposes sounded like a high cost for graffiti.
Shake and Baker
So as the last functionality, decals had to bake themselves into a single texture to reduce the draw call and avoid the overuse of texture memory. It was achieved with a scene capture with a render target. It only captures the inside of the actor so that nothing can intervene between the scene capture and the graffiti. Graffiti is visible on an invisible wall only visible to the scene capture camera. In this way, graffiti is always rendered without it being cast to a wall in the scene and it does not get deformed if misplaced in a weird angle.
Overall I feel like I hit that 70 percent threshold I was aiming for in the beginning. I have other various ideas about where this project might have gone or been achieved, but at one point, I should be able to call it done. In the future updates probably I will add some of the stuff as well, but I am content with how far it came so far. Special thanks to my colleagues Atakan, Sertac, and Cagatay; they helped me a lot with the code side of things.
You can purchase the generator here.