This is an online VR 2-players co-op puzzle game. In this game, 2 players will connect through their Steam accounts and work together to solve a series of puzzles in a VR environment. Players will traverse through the overworld and the underworld using laser triggered portals and find their way back to earth by interacting with various devices.
Project Website: Duolatera
Try it out here:
Google Drive Download
Here is the gameplay video for Act1 & Act2. ↓
5 months, 2024.8 - now
5
Technical Artist, Gameplay/Graphics Programmer
Unreal Engine 5, C++, HLSL, Forward Rendering
The overall art style of Duolatera is low-poly and cartoonish, therfore, we decided to use cel-shading as our render style.
Due to multiple reasons such as framrates and Duolatera being a VR game, we use forward shading as our rendering pipeline(default UE5 VR setting).
Normally, cel-shading in deffered rendering is achieved by accessing the G-Buffer for various data and applying post-process effect on the whole scene.
Using forward rendering means that there is no G-Buffer for me to use and therfore I have to find another way around.
In order to achieve the cel-shading effect, I replicated the phong model and created a material function that converts the input color to cel-shading color. Artists can easily use it on any object they want or even any part of the texture they want.
For example, they can use cel-shading color for a part of a prop but preserve other textures on the prop. The Pistol on the right is an example.
One of the main mechanisms of Duolatera is Portals. Portals exist through out the whole gameplay and they always appear in pairs. If a portal exists in the Overworld, a corresponding portal must also exists in the Underworld on the same spot. Players travel between worlds through these portals to solve the puzzles.
Portals are all closed by default and are triggered only by "tagging" with laser tools. Here is a triggered portal in the Overworld and its corresponding portal in the Underworld.
The portal shader consists of 2 different materials: A base material and an overlay material.
Base portal material is the scene texture captured by invisible cameras from the corresponding portal resulting in the "seethrough" effect.
Overlay portal material is the VFX part of the material. It consists of distortion, "vortex" effects and allows customizations during spawning. Since portal VFX looks different in Overworld and Underworld, their materials are spawned when portals are triggered open.
Overworld Portal
Underworld Portal
There are several kinds of props that player can interact with. 2 of the most important ones are "Taggables" and "Interactables". "Taggables" are the ones that players can shoot with their laser guns and "Interactables" are the ones that players can interact with their VR hands. It's important that players can distinguish between different types of props so they can interact with them the way we intend.
Taggable material is a continuous 3D overlay material which works with all the props in the scene regardless of the object's location and rotation. Since the material is continuous in space, objects that are close to each other looks like they are under the same piece of texture.
Interactable material is a world-space material which only takes the object's Z location value into account. It is commonly used in many games as indication for something that is interactable.
I'm also in charge of a variaty of other visual indications in Duolatera such as outline material and aura material.
Taggable Material
Interactable Material
Duolatera has a main menu and an in-game menu. In the main menu, players can start the game/tutorial, calibrate themselves or exit the game. In the in-game menu, players can leave game, calibrate themselves and change voice chat settings.
For the main menu, I implemented the UI functionality as well as game pairing functionalities. To start playing, players can either create sessions or join existing sessions.
For the in-game menu, I implemented the UI functionality and voice chat related functionalities. Players can enable, disable voice chat or set it to push to talk.
I implemented the dialogue system for the onboarding level. This is intended as a tool for designers to arrange dialogue prompts for onborading.
Designers can easily add, delete or move an entry. It is also a handy tool for them to set the desired input or lasting time for players to continue to the next promt. By unchecking the "can continue" box, designers can set custom events to take place before the next dialogue entry.
Apart from the above, I'm also in charge of some gameplay functions such as sub-level system and functionalities of some game items.