Trying to steal Vray's thunder.
I'm gonna wait for Steam version
It’s not often that you come across projects as massive and as ambitious as Warrior’s Pilgrimage. It’s a huge undertaking, created by Arif Pribadi and Audrey Wong. Arif is a seasoned developer and 3d artist, who worked on a number of big hits for Gameloft, and also contributed to Fabric Engine and Tinker Games‘ Legrand Legacy. His new project is a step in a new direction. In our interview we discuss the production of Warrior’s Pilgrimage, discuss the production of materials, assets and world-building practices. Check it out!
My name is Arif Pribadi, I have been working on several Gameloft Projects for 6 years and 8 month. The projects I worked on include hit mobile game titles such as Asphalt , Modern Combat and Siegefall. And I have been working on Modern Combat series since the first Modern Combat , including the first proposal pitch art.
After more than 6 years and 8 months in Gameloft, I finally departed in order to get my Degree (just for 7 months),which is I think still quite useful for Visa and other paperwork nowadays.
During the downtime, (between the time I left and the time I started the course) , I did some freelance work such as teaching and doing various 3d work, from doing 3d Creature for Fabric Engine : Kraken to Gamedev technical mentoring for Tinker Games latest project’s: Legrand Legacy (Indonesian indiedev). With this title I really want to challenge myself to a bigger project. It is called Warrior’s Pilgrimage. It is a project I did with my only teammate Audrey Wong.
Check out the presentation video:
Some of the screenshots
The Infinite Canvas
The main idea is to create a large playable art.
At first, it might sound ambitious, but I would rather have expandable concept and ideas than make “safe ideas” with the small area of art and technical exploration that often regret me later.
The first time I learnt about Infinite Canvas was when I had short Cgsociety online course with David Baldwin. But the way I interpet it might be a bit different (originally proposed by Scott McCloud).
Instead of going into “safe direction” during the pre-production, I will create something really big, something quite impossible to finish, but quite satisfying to write and develop.
Weeks later after I went into several research and discussions, I started to trim and modify the draft into achievable plan within 6-7 month deadlines. But nonetheless the core ideas and concepts are still expandable and fun to revisit.
The main goal of course is just to create playable art or portfolio at the moment. This project is to test our limitation of what we can do within small team.
As for me, even though I still sell myself as professional 3d Environment Artist, I also since long time ago, really wanted to learn to be self sufficient, not necessarily to start indie game business, but I just want to execute the idea and story without depending on large team.
And that’s why I decided to use my time in University of Hertfordshire term time to improve my Unreal 4 game design skill as much as possible, not just art , but also blueprint and animation in order to create fully playable piece of art.
I’m not alone in my endeavour. Audrey Wong is part of the team. She wants to learn to become better sufficient environment and prop artist and improve the ability to work on the core environment team . I think as my only teammate, she got really good foundation in unique and hero assets, that is why she is an essential partner.
I always love to focus on big picture, and gradually polish the assets and add some more details. The way I do usually is to focus on first area where the player spawn, and using landmark and subtle art direction guide the player to the goal.
This sketch and blockmesh with blob trees is not really an appealing material for common audience, but I do it for quick plan of the composition and the walkthrough.
It begins with the early concept and blocking out. The view intended from the beginning to be look really open yet very linear, you may walk around the designated path but you cannot go beyond it. I am responsible for world building, while Audrey Wong is responsible for most of the details in architectural and village hard surface props.
The type of cliff and landscape I choose is based on the stereotypical Chinese yellow mountain landscape painting. Kind of exaggerated, but hey, it is a fantasy game. (As long as we got the foundation right of course).
While we tried our best to make it look as massive as possible, it’s not as big as you think.
I always make sure, everywhere the player goes, he can find a large open area. The user should feel, as if he is able to go to that far mountain.
It is not really quite a new technique. Back when I was working on Modern Combat 2 for iOS , most of mobile FPS games were set in enclosed area. Same thing is true about Wolfenstein. It is understandable because of limited hardware and manpower.
However our Modern Combat team wanted the game to look less claustrophobic. The most effective method to fight with this is to draw vista background. It doesn’t need to be physically correct or hi-poly , it just needs to be there for the player to see. This background also has a lot of functions and could be used for game design and storytelling.
The list here shows the importance of Vista in games:
- It helps player’s orientation. You can easily navigate the game without a map.
- It gives information of geographic and climate condition, so we can work on consistent natural elements and architecture texturing there.
- On top of that, I usually shape the landscape before adding buildings. Imagining how the castle, town or village could be built upon such landscape.
- Draw some subtle road path so we know how they transport to the outside world.
- It creates an illusion that the game is bigger than it is supposed to be, this is great tool for storytelling and expansion plan either it happen or not , because many audience love to have untold story instead of have everything explained..
However the concept above shows what player is expected to see. It’s a view that I always love. Of course nowadays this point of view is quite common.
There are many terrain tricks out there. I prefer to make far mountain with traditional modeling, and fill the top part with foliage.
Our technique is similar to classic Walt Disney animation approach as seen on “4 artist paint 1 tree”.
While not always the case, but this is the graphic explanation for our pipeline
We both are experienced with Zbrush Sculpting , but having to sculpt many ornament is quite a new experience. Of course the first progress starts slow, we spend our time getting the right and consistent technique. The most important part of ornamental sculpting is getting the right and consistent reference library. Our current theme is really challenging. It’s based on Indian, Cambodian, and Balinese culture and ornaments.
Now to get things fast, we build some z-tool library. Then shared in Dropbox and Mega, instead of exclusive ownership for every ornamental sculpt, we shared elements and subtools we did in Zbrush.
Sometimes we use MRGBZgrabber to grab finished sculpture heightma , and use it somewhere else.
After quite some time, our library just became big enough to work faster and more consistent.
Iteration is quite important, especially in main areas.
This is the early temple area iteration
And this is the temple now
As you’ve noticed, I totally reworked the structure (this outdoor temple is fully my responsibility), but kept the main silhouette.
In the earlier design , there was an experiment whether I can get away with fully procedural brick from Substance Designer or not, apparently the method wouldn’t work well in a large temple where the architecture should look uneven and fragile.
The main temple is dominated by unique large bricks and elements. Then in the middle part I use tiling textures.
Since our team and resources are really limited, we rely on automation to get things done.
For environment texturing (and hipoly modeling), we split up the job:
Mostly the hard surface and environment asset including hi-poly modeling/retopo is done by Audrey Wong, except for all the nature part and outdoor main temple. Once she finishes baking normal map and diffuse mask, I start generating automation for diffuse with Substance Designer.
Audrey is also responsible for village area polishing, collision placement, and triggers in Unreal Engine 4 (and also main area assembly, where the statues are placed) .
We started from greyscaled object with normal map, instead of color diffuse everything before the asset is polished, because we need to focus on shapes, silhouette and detail frequency first.
Color is just a distraction in early 3d production, because most artists tend to do too much iteration on color. We all have different taste of color, even if we’re working on our own, we can change our mind about the hues and tinges.
That is why we avoided setting up color during the early production.
As usual I do blockmesh, mesh integration, and make sure all objects are ready to be polished and are still in place when exported back.
Audrey Wong did hipoly and Zbrush polishing, meanwhile, I worked on nature parts, splines, and foliage. I had to make sure non-hero elements are highly reusable.
Once it is done and baked she gave the assets it back to me. We temporarily worked on separate unreal level streaming, so we can work in “parallel”.
This is the greyscaled result with baked normal map.
All the small village props are done by her (except the lamp, ground, and platform). Once the normal map is finished, I start finishing the texture map using Substance Designer.
Working in 16 bit map
The huge advantage of using Substance Designer is that you can fully work with 16-bit map,
This allows me to adjust much larger range of RGB or black and white without significantly destroying the range of the value (because of limited 0-255 value in 8 bit images). Always work on 16 bit and make 8 bit output as Targa file (targa file will always use 8 bit anyway).
At this step I gather all the baked map and lowpoly Audrey has produced.
In fact Substance Designer plays a really big role in speeding up our pipeline, any iteration and reproduction for different assets can be set quickly once I finished the “master” texture generator as displayed above (wood, door, concrete, loam, etc) .
I just need to connect different Raw/baked texture, and then new consistent texture will be be generated. Doesn’t matter if the Raw is tiling texture or unique texture, the method mostly works.
Although you see many outputs here, most of it is just for Substance preview, the only map I export is Diffuse , roughness, and SRT. This way you can reduce the map file amount and memory use.
Finished look combined with platform, terrains, and other natural elements.
Part 2: Materials
Now for another fun part, let’s talk about materials in Unreal Engine.
My landscape will automatically grow some grass and occasional small rock everytime I paint grass texture on my landscape.
You can do this with the material tool called Grass Tool (it can be found in material editor).
It should be connected to grass type.
With grass tool:
Without grass tool
This is how my moss shading setup looks like.
I use pixel normal (blue channel mask) so the fresnel and the moss only appear mostly on the top.
As you can see, I use material function (nothing really magical here except material function allows me to group messy nodes into function group) and moss with fresnel, usually moss has shiny green highlight when we see it from side.
Moss shader in action. The moss will be always appear on the top of the rock regardless of their orientation.
In Cave area, I also added alpha Rubble using POM (parallax occlusion map) to give small transition between ruins and the ground. Unfortunately I added this feature after I released the first trailer on Youtube, so you won’t see it in the first trailer, maybe I will show it on the game demo video next time.
And this is the result of parallax occlusion map, very effective and low poly!
This method is pretty much inspired by one of Epic Games podcast showcases.
I was always fascinated by Kite Demo partial light and Uncharted 4 lighting, it seem to have become a trend in the current gen to have gobo cloud shadow (image based shadow) from the directional light. So I tried to reproduce it in Warrior’s Pilgrimage.
In Unreal Engine 4 we use Light function material in order to create image based shadow, and plug it on directional light.
It is also good for faking large mountain shadow, where it should be smooth and gradually disappear on the tip of the other mountain.
It might not physically correct of course, but I am quite satisfied with the result.
Light function material
For Interior Light , traditional lightmap baking does the job, we just need to distribute few key point light and spotlight here and there, and some static blue lights for extra ambient feel, static light is good to make additional light without sacrificing the performance.
On this particular scene, I got help from Audrey Wong for early light placement because I was busy working on outdoor Temple area. Once the light is adjusted, I baked it for the final look.
The fluidity is coming from 3 things: using mocap animation, cloth simulation to get additional cloth animation and using the combination of Blueprint and BlendSpace to get the blending between Idle , Walk, and Run.
Even when you suddenly stop the player from running there is some little bit blend in it.
Now I am not animation expert, I wish I could add MGS style wind movement on his jacket but I didn’t have enough time to figure it out, but I managed to add very subtle wavy animation on his jacket-fur using material world position offset ( same technique I did for foliage animation).
It might be just a cherry on the cake, but I always love to add small details.
The character animation is built using mocap from motcap.com. It’s a free mocap website.
At that time I thought it was good shortcut since animation is not my expertise. However in the end I had to clean up the animation quite a lot.
Some simpler movement such as idle animation is hand animated.
But as I mentiond there is transition between Idle, Walk and Run. This feature is not enabled in default Unreal mannequin animation.
All I needed was to work on the blendSpace1D parameter and some blueprint works, it is a bit overkill but at least I am kinda satisfied with the result.
Of course it was daunting task to learn in the beginning because I was completely unfamiliar with Unreal animation pipeline back then.
I started with week and days of frustration but I just kept working until it worked.
In the end I started to memorize the animation pipeline. And a lot of blueprint functions, the learning process really paid off.
Using Unreal Engine
Of course the production of raw asset is done with art tools such as 3ds Max, Substance Designer, NGplant, Zbrush, Photoshop, etc.
The good news is Unreal Engine gives all I need, there is almost zero need to download additional plugin in order to achieve the graphic quality and features I wanted.
Also as an artist who doesn’t have experience with C++ , built-in Visual programming such a blueprint helps me a lot to accomplish many things including creating gameplay for my project.
Even though there is no “real gameplay” here, a lot of art features rely on blueprint.
Some of the art features such as grass movement collision are done using blueprint (that detects characters location) – connected to the grass “rotate about axis function” in grass material.
If you come across a daunting technical obstacle, always do simple debug in every step, it’s a common practice in programming, regardless what programming language you use.
For example, in blueprint you need to test whether your game is really saved or not, you can use “print string” node, to make sure once the game is saved , there will be “game saved” text on the screen , otherwise it will say nothing.
An example of flow debugging in Unreal Blueprint
I connected the return value to branch then it connected to “Game Saved” print string node, supposed that the Save Game to Slot node fails to execute, I won’t see “Game Saved” during the gameplay, at that time I will realize that there is something wrong.
Same step when you work on materials in Unreal.
This is an example of material debugging : I just want to make sure that the grass detect the character position, red color indicate the mesh is being affected by the character.
First biggest challenge was the technical aspect of this project, risking my time to learn new technique is an inevitable gamble.
The possibilities of failure for not delivering on time is always there.
I was comfortable with 3d modeling, Unreal shaders, static environment art, and basic blueprint . However I had to learn much more blueprint to get the game functional. And also learn to integrate character in Unreal and make it playable!
Other minor blueprint task also could take time just because I was unfamiliar with the step. Such as having working checkpoints, and calling events.
Gladly as I mentioned before, always tackle one problem at a time, take a note, watch tutorial and bookmark any useful article you find.
And again, always do debugging!
Soon without realizing it, you’ll be memorizing a lot of technical issues and will learn how to solve these problems quickly.
Teamwork is really important here, regardless of how small or big your team is. Make the team work effectively. With only 2 person team, we must be more than just specialists.