logo80lv
Articlesclick_arrow
Talentsclick_arrow
Events
Workshops
Aboutclick_arrow
profile_login
Log in
0
Save
Copy Link
Share

Creating Hand-Painted 3D Harbor Scene Designed Around Gameplay

Kostia Perry walked us through the Bilgewater project in detail, explaining how he translated a 2D illustration into 3D, adding a personal touch to the environment, and discussing the custom solutions used in the process.

Introduction

Hi, I’m Kostia Perry, also known as Tarmunds online. I'm a 3D Technical and Environment Artist based in France. At the beginning of my art journey, I really wanted to become a Concept Artist. So I studied a lot for that and fell in love with digital painting, which still influences me today.

I joined Artside School with the goal of becoming a Concept Artist, and that's when I discovered that you could paint in 3D. It completely blew my mind. Later on, when I discovered Unreal and the ability to interact with your world by pressing a single button, I knew that was what I wanted to do with my life. I dove deep into environment art, focusing especially on stylized, hand-painted, and Unreal Engine-specific workflows.

As I moved forward in my journey, I wanted to push visual quality and interactivity even further inside Unreal, which led me down the technical path. That's when I started exploring shaders, tools, and pipeline creation. Down in the rabbit hole of tech!

The Bilgewater Project

I first fell in love with Grace Liu's awesome concept, which really resonated with me as a huge fan of pirate universes. My main goal was to translate the feeling I had of Bilgewater into 3D. Not based on lore or other images, but purely from the vision I had in my mind.

To achieve that, I chose a hand-painted PBR workflow. This allowed me to retain the painterly feel while incorporating dynamic lighting and interesting metallic and roughness values. I had some previous experience with workflows similar to Wayfinder, but I didn't want the same sharp and "crunchy" look. I aimed for a softer, smoother shading that would enhance the painterly aesthetic.

I was also deeply inspired by the work of Airship Syndicate on Ruined King, especially their concept art. In terms of references, my PureRef board wasn't very broad. It included some painting references and Grace Liu's related artworks, along with concept art from Virgilia Critchfield and Baldi Konijn made for Ruined King.

Getting Started

The blockout was done quickly, but I spent enough time solving all the proportion, layering, and perspective issues. I constantly went back and forth between Blender and Unreal to test everything with rough lighting and a proper camera setup. For the composition, I kept the original one but cropped it to better highlight the point of interest. That also helped me reinforce directional lines and dynamic flow in the scene. 

The wooden planks were a real challenge. I redid them many times to find a look that fit well. Since it was one of my first top-down scenes, I wasn't used to the level of detail needed. You can actually see how the floor planks evolved over time, becoming simpler to avoid noise and letting the composition carry the detail instead of the asset.

1 of 3

For the pillars, only the cap is sculpted. The cylinder part uses a second UV channel for tiling textures, blended with the baked cap through vertex color. UV parameters are exposed via Custom Primitive Data, so I can vary scale and repetition per instance and freely adjust pillar height. To populate the harbor, I created a spline mesh tool to array ropes, with exposed parameters to control swing animation, orientation, offset, and pivot point directly from Blueprint.

For cloth, I drove a noise pattern through WPO using baked vertex color. The flag setup was more interesting: I rotated them around their pivots using sine waves and  perturbed their normals with the same pattern to enhance the flapping motion.

Most of the small assets were kitbashed. To handle this efficiently, I created a shader that allowed me to switch between different kits using alpha vertex color. For example, alpha = 0 for baked maps, 0.25 for the metal kit, 0.5 for the wood kit, etc. The application of those was directly made on the DCC software side. This allows for a reduction in the draw calls per material slots, as there is only one material for the kitbashed asset.

As an example, the pole that holds the lantern uses trim sheets from the metal kit in addition to parts from the wood kits, all within a single shader to minimize draw calls. The lantern itself uses only the metal kit.

These tricks, combined with a solid modular kit, helped me stay efficient and speed up my workflow.

Retopology

Most of the assets were low-poly and then cleaned up in Blender. This allowed me to save time on retopology while focusing more on UVs and baking to ensure everything looked good in-engine. Since it's a top-down project, the limited camera rotation allowed me to benefit from decimation without many drawbacks like overdraw or depth issues.

For the modular kit parts that were bent and deformed afterward to be kitbashed, I preferred hand-retopology to ensure cleaner deformations.

All my meshes had clean UVs to minimize baking artifacts and in-engine errors, even when based on decimated models. I used a mix of custom tools that I've made for myself, and the Mio3 UV add-on in Blender for this. To speed up the process further, I created an addon that lets me "one-click bake" from Blender to Marmoset. This made baking and iterating smooth and fast. I've shared it for free here.

Texturing

For creating the hand-painted textures, there's no trick; I painted them by hand. After baking my maps, I went straight into Photoshop to build a base color using the baked maps. From there, I did paint overs to add color variations, detail, and life to the materials. I'm also used to editing the normal maps manually to make them match my paint. For example, if I paint new cracks on the albedo, I directly adjust my normal map.

In Unreal, I set up a custom shader that enhances the albedo while keeping dynamic lighting. I also remapped the shadow values to appear brighter, helping to reduce darkness and bring back the painted look across the whole scene.

Lighting & Rendering

When laying out the scene and scattering details, I tried to tell stories throughout. For instance, there's a pole where I imagined a lantern had fallen to the ground, causing an oil spill. Little moments like that helped me bring life to the environment and kept me in the mindset of a storyteller.

Lighting was a key element for this project, essential to making everything feel cohesive in the final scene. I experimented a lot to achieve the eerie, gritty, and gloomy vibe I was aiming for. A big part of that came from tuning the global exposure and using Mie scattering to simulate an overcast mood. Initially, I leaned too much into green tones, but eventually shifted to a more bluish green palette that felt closer to the sea. To contrast that, I used warmer, orange-tinted light sources, creating a pleasing complementary color balance.

One touch I added to enhance the painterly feel was a flipbook billboard on the lanterns. These gave a glowing aura to every light source and helped unify the painted aesthetic with dynamic lighting.

Tools

I implemented various technical solutions in this project to speed up my workflow and improve performance. Here's a breakdown of a few of them:

Rope Tool

To easily populate the harbor environment, I created a spline mesh tool to array ropes. While it's not the most advanced tool, I added functionality to pass Blueprint data through materials, allowing me to control a subtle swing animation. In those exposed parameters, I could adjust the swing orientation, offset, pivot point, and masking. In the end, this gave me a lot of control over how ropes were scattered and animated across the scene. 

Sign Animation

In the same direction as the rope system, I also added the ability to toggle simple animations directly from the main shader, driven by shader parameters. For example, the sign has a more complex swing animation. Vertex color was used to ensure the chain bends while the sign itself stays rigid. Parameters like pivot position and angle are adjustable. I also ensured normals rotate along with the mesh to preserve correct shading during animation.

VATs (Vertex Animation Textures)

Given the large number of seagulls in the scene, I wanted to test VATs to optimize animation. I first tried it on the fishing rod to bring it to life. Then I baked two animations that I've made for the seagulls, one resting and one flying. These animations are toggled using a single float value, allowing me to drive bird behavior through Blueprint. It helped reduce runtime cost while keeping the scene dynamic.

Wood Pillars

For the wooden pillars, I used a simple but effective technique where only the cap is sculpted. The pillar's "cylinder" part uses a second UV channel for tiling textures (the first UV is used for baked details). The transition between the baked sculpt and the tiling texture is handled through vertex color blending, which I can adjust per instance if needed. I also exposed the UV parameters of the tiling texture via Custom Primitive Data, allowing me to vary the scale and repetition for each pillar. This technique allowed me to easily adjust the height of the pillars and focus the artistic detail where it matters most, the caps and tileable section.

Water Shader & System

For the sea, I baked a water simulation into a flipbook containing displacement, normals, and custom masks (e.g., for foam). I used a single-layer water setup in-engine, integrating SDF detection for objects intersecting the water.

I added simple foam generation that's triggered based on water height. Each asset samples this height with a slight delay to simulate foam appearing at contact points. All water-related elements (plane, parameters, etc.) are managed via a single Blueprint that stores most values in a Material Parameter Collection (MPC).

I'm happy with the water system overall, but with more time, I'd rework the foam system by baking an accumulation mask to make foam behavior more accurate. I would also bake a world SDF at water height to get more precise water-object interactions (not performant for game purposes, but here in an art focus).

I've also implemented a lot of connex tech, especially related to the "gameplay" side of it.

Conclusion

This piece took me four months to complete, not including the character (which I did afterward). I worked on it while studying at Artside and juggling freelance work, so time was tight. I've learned how to create a tool for myself to increase my efficiency.

If I can give a few pieces of advice to beginners: first, don't limit yourself. Don't let technical constraints kill your creativity. If you want to make something but don’t know how, learn it. It's tougher than staying in a comfort zone, but it's worth it.

If you want to go into a hand-painted style, then paint. The beauty of hand-painted art lies in its imperfections. Trying to fake it through filters or procedural will never be as impactful as doing it manually.

Lastly, for student Environment Artists specifically, learn different workflows. Learn how to build environments, how to work with tileables, trimsheets, decals, and more (even tech). Don't stay stuck in the baked props pipeline. The more tools you have in your toolbox, the more creative freedom you'll gain.

I'd like to thank everyone who took the time to give me feedback on this project: Sacha Veyrier, Nicolas Ceriani, Anthony Lemetayer, Romain Durand, Camille Delmeule, Florian Potier, Lionel Cregut, Matthieu Laude, and Arnaud Claudet. And my friends Elisa Binz and Thomas Grosjean. Your input made a real difference.

Kostia Perry, 3D Environment & Technical Artist

Interview conducted by Amber Rutherford

Ready to grow your game’s revenue?
Talk to us

Comments

0

arrow
Type your comment here
Leave Comment
Ready to grow your game’s revenue?
Talk to us

We need your consent

We use cookies on this website to make your browsing experience better. By using the site you agree to our use of cookies.Learn more