Closed Bicycle Rental

Environment Breakdown

Chun Wei Ong


Chun Wei Ong

Texture Artist


Hello everyone! I’m Chun Wei Ong from Singapore. I’m currently working as a Texture Artist in Ubisoft Singapore. Ever since young, I have always been the kid that loves video games, and always feels immersed in all these meticulously created worlds. Today, I’m happy to be making these worlds alongside many talented people to inspire more people like me.

Thanks to the good folks at Games Artist, here I am, to share some breakdowns and tips from my latest personal project, Closed Bicycle Rental.

Inspiration & Goals

For my past few projects, I have been making environments that inspired me in other countries. But I have actually never made an environment from Singapore, where I am from.

We are a really young nation, with not as much history and heritage, so everyone that knows Singapore, only knows us as the modern metropolis. And then I came across this news of bicycle rental in Pulau Ubin that is going out of business. The photographs by Wan’s Ubin

Journal showed a derelict shophouse but it had a beauty to it. It had history and storytelling in its structure and materials so I decided to make it.


Modelling and UV: Maya and Marvelous Designer (for fabric)
Detailing: ZBrush
Texturing: Substance Designer and Painter
Rendering: Unreal Engine 5


The main reference for me came from Wan’s Ubin Journal’s photographs of a closed bicycle rental shophouse. Because I couldn’t find the higher resolution version, I treated it like a concept art made from photo bashing and tried to figure out some of the details myself.
Gathering other references for me meant that I would be taking a lot of them from Google Maps as I was basing it on a real place. And then the rest of the reference gathering was for the materials, weathering, props and quality benchmark.

[Below: Photograph Credit, Wan’s Ubin Journal]


The quality benchmark references came from Metro Exodus Enhanced Edition. The game is just remarkably beautiful with and without raytracing. The lighting reference came from mid 2000s Japanese commercials where there is some usage of bloom and high exposure.



To start off, I want to bring up a level of quality system that we use in production. Of course,this image is made after the production has been completed, but I just want to show some high-level expectations for each level of quality.


Kicking off L0, I started off the block out in Maya, modelling the entire block out, not worrying anything about modules or anything technical, just focusing on shapes and composition.



Following the blockout, I start to plan out some of the modules that I need and model the modules in a gray box quality akin to L1 quality, where there are some shapes and big details to the model but it is not polished.


Texture Planning

Planning out trim textures would be my next step. I usually write it down in PureRef since I have all of my references in it, and it’s also easier to start working and know what I am going to do for the day just by looking at my pure ref board.


But admittedly, planning a texture list just by looking at a reference requires some practice and experience.
I would recommend beginners and students to do this exercise below where you do a basic paintover to see what kind of textures you need.

This will also help even more advanced people to visualize and also if you take a break from the project, coming back to a nicely planned paintover would help a lot in getting back your momentum.



The majority of the textures are done in Substance Designer. Nothing too fancy if you are already familiar with the software. Here are some tips I can give to anyone trying to get their texture to look richer with details.


This is a trim sheet for the shutter doors of the shophouse that I made in Substance Designer.

Now let’s look at some tips and common mistakes.


You can pack several of your props in one texture map by packing their UV shells together and exporting them together, as long as they are named properly in their _low and _high mesh groups (e.g. fan_low, fan_high).

This is extremely helpful in reducing draw calls and even optimizing the texture space. Only needing 1 texture set and 1 material, instead of 6 texture sets and 6 materials.



I just want to touch on some tricks to easily do UVs using trim textures. Mostly revolves around stacking the shells and using Randomise Shells to get fast results so you can focus on polishing.
Many of you might already be familiar with this workflow but I want to share it because I think the students and beginners would appreciate it.

Here’s a GIF below to show this entire process on a very simple window model.



As for the shaders set up, one of the things I wanted to try and avoid on this project is to spam material blends on everything. Because full material blends are generally considered quite expensive by Technical Artists. So here is one of my master material setups that I use for the majority of the project.


What this setup does is allow you to have a singular solid color that you can paint on vertex channel R, to break up materials and create variation. Additionally, there is a switch to allow you to randomize how the mask will show up based on the object’s position in the world.


And the technical wizards amongst you might have realised that I inverted the vertex paint before passing it through, this is because the default vertex colour on any mesh is white, and

I don’t want the full effect to show on every mesh by default so I simply inverted it. That means I have to hold down Shift while painting (because shift inverts the paint value), which is totally cool because that’s what we have in production and it prevents accidental painting.


I used Dbuffer mesh decals for my decals. In hindsight now, I probably should have built everything to work with Deferred Decals as they are much easier to work with.
One small tip for anyone who might be scratching their heads while working with decals/masked materials with Raytraced Ambient Occlusion turned on, you might need to activate this command line to get proper shadowing.

(r.RayTracing.AmbientOcclusion.EnableMaterials 1)



On the technical side, I used Nvidia’s RTXGI plugin for my global illumination solution, mainly because Lumen still has some bugs and limitations to iron out. I still used lighting bake to get all the larger shadow casting to prevent major light leakage.


Even though I think RTAO is better than Lumen AO, and some bugs with Lumen not casting the right shadows on masked or SSS materials, I think it still comes down to what you prefer.

As mentioned previously in the lighting reference, I wanted to create a feeling of nostalgia in the lighting through the usage of bloom and higher exposure. And one of the mistakes I made in the early part of the lighting process was using a light intensity value that was a bit too low. We have to remember that sunlight is the most powerful light source.


As you can see in the image above, it looks a little off as daylight is supposed to look very strong. So I worked on the post-processing, exposure, bloom, chromatic aberration etc. Most importantly raising both the intensity of the sunlight (default is 10 lumens, I used 6 lumens) and the exposure of the camera to fit into what is closer to real-life values.

For anyone that is unfamiliar with post-processing or cameras in general, I highly brecommend William Faucher’s video. It’s a short 30 minutes video that goes in-depth into cameras and post-processing with fantastic examples.


For this colour grading, I used the offset to lift the values a little bit so that the shadows will nnever be pitched black in the darkest areas. As well as some tweaks to the gain and gamma to make the shadows feel a bit warmer.


And using Lighting Scenarios in Unreal meant that I can create separate lighting in my level without having to duplicate everything as a separate level.


First off, thank you to the folks at GamesArtist, Alfred, Conor and Raphael for giving me this platform and opportunity to share my work! This is my first ever article so I’m incredibly excited to share it with everyone. Also shout out to my team in Ubisoft Singapore, Nathan and Russell!

This entire project took about 5 months from mockup to “completion”. It was an on-off process definitely to keep myself from burning out, mainly because my full-time job is already making textures. It did help a lot that I played many games (especially Elden Ring) during these 5 months to feel inspired and want to work on my own things.

For anyone that feels like you are no longer enjoying the process of creation, take a break.

Play some games, and watch some movies/shows to remind you why you enjoyed doing this in the first place.

Thank you for reading and I hope you have a great year ahead!