Nina Klos told us about the workflow behind the Koi Pond project, shared the shader used on the fish, and explained how the water was made.
In case you missed it
More from Nina Klos
Hey everyone! My name is Nina. I’m an Associate Technical Artist at DR studios also working with the environment team on an unannounced title. I finished my bachelor's in 2021, and I will have been working in the industry for a year this upcoming May. I like making colorful living work, especially in combination with my second passion – fish!
The Koi Pond Project
The Koi Pond came about from the need to make art. My anxiety flared up badly again during January, I found that making something peaceful brought me the needed distraction and peace. I haven’t explored many freshwater fish in my art yet, so I thought a pond was a perfect place to start. I used a loose reference image from Aquascape for the composition. The main aims of this project were to push my environment skills, learn better foliage, and explore more shader techniques. Mainly, I just wanted to have fun and make something pretty.
The bulk of the scene was rocks, foliage, and a large bridge. The bridge started off as 3 boxes put together with two separate material IDs (base and planks). Once I had the blueprint spline working (there are a few simple tutorials on it, so I won't go into detail,) I tested the offset texture. It’s based on each plank position, meaning each one will tile randomly to create a new wood grain pattern every single time, and they will move slightly to the left or right using WPO. In addition, it’s also giving them a random color, brighter or lighter to break up the bridge more.
The wood grain was created in Substance 3D Designer. Once finished, I simply dragged out the spline to create my curved spline bridge and added some moss/dirt decals to further break it up.
The fish were low poly I created in 3ds Max. I created a custom scale texture in Substance 3D Designer and I applied it to the fish in Substance 3D Painter, using anchor points to control their position and scale. After positioning, I handpainted the rest of the fish details directly with some transparency on the fin edges. I used Masked and DitherTemporalAA in the shader for the fins to save on performance.
As for the shader, I developed it over the years from various fish attempts. It simply pans across the mesh in a sine wave, with a random wiggle timing based on particle instance. In addition, I have a random color (yellow, red, and white) also based on random particle instances.
Finally, I added these fish to the Niagara particle, using gravity to make them go in one direction, added some Curl noise, and locked them to the Z-axis.
I’ve done a few iterations of water, but this was my first time using Single Layer Water, which allows you to create transparent water that is actually opaque and add more effects to it, like caustics and depth through the custom outputs.
The basis is quite simple, just Normal maps panned together. On top of that, I added a Flow map to break up the repetition and a fake sky reflection to add some blue shades and clouds. There is also a bit of foam that floats by, more visible in the waterfalls, and of course, a bit of refraction. The edges around rocks are also highlighted using Scene Depth Without Water to get the same effect as in DepthFade but working on opaque material.
I also added some multi-colored caustics by simply dragging out the color channels in Photoshop and using that texture panning both ways in the ColourScaleBehindWater output. As the rock floor is quite detailed already and the water Normals are pretty strong, I wasn't too concerned about how simple this caustic was.
The waterfall FX was created using Niagara. The waterfall splash is a panning sine half-cylinder mesh with the UVs moving down vertically. Not sure how many people noticed, but I also added a small flickering rainbow here!
The Rocks & Vegetation
I initially started with a set of rocks for the scene, building out the main shape. The rocks all have world position shaders on them meaning I could make them any shape I liked, and they’d still have the texture wrapped correctly from top to bottom. Like the bridge, they also have a random color but are based on a random instance to work with the foliage system. I also added a global wetness line based on the same idea as the color in my Kelp Forest project. It adds a shine to the rocks making them look wet and dark closer to the water. Lastly, they have a bit of moss added in the intersections, which is created using distance fields.
I created all the foliage inside 3ds Max and baked it all down in Substance 3D Painter onto a single sheet, colored them, then repositioned the planes into shrubs/flowers back in 3ds Max.
The final setup was just a lot of tweaking and little things added. One was creating the light shafts, which is actually the exact same way I made the caustics, even the same texture. It’s a light function shader applied to a point light that creates some nice movement.
Post-processing effects were added: some depth of field, bloom, color tweaks, AO, and lens flares.
Things like the plants, water, and fish were tweaked a few times, and I asked for feedback from some friends to help see things I missed. The scene was very dark and orange before, and the rocks were too low poly, they all went through a polishing process. It’s good to not rush and give yourself some time to fix little pieces. I ended up with a 26-line list that I just worked on over a weekend.
The very last thing I added was the little butterflies. It’s a texture I photographed at a local museum and made a little WPO animation of, then stuck them into Niagara to make them fly around. I also placed a few butterflies chilling on rocks and lily pads.
In total, this project took me about 1.5 months, but I only worked on it on weekends. It was small enough that I could take time off if I wasn’t feeling well and still hit the deadline I set myself: I started in January and I wanted to finish it by the end of March.
As this was very much a comfort piece, most of the shader work was quite simple. I think the bigger challenges came from getting the environment to look right and realistic. In my previous pieces, I’ve gone down quite a stylized route, so adding that extra layer of detail really brought this one to life and made the art very fun to work on. Nothing was difficult, it was just time-consuming to push myself a bit further than before. I try to improve on every single piece, even if just incrementally.
The biggest advice I can give to younger artists is to keep your project small to not overwork yourself. This allowed me time to polish and improve my work. I would also say try to make something that hasn’t been done before, in your own style. It’s good to learn what others have done, but having your own voice in your art will make it stand out from the rest. Even if you don't like what it looks like now, if you repeat it and keep practicing, you'll learn quicker than you think.