
Taiwanese Traditional Restaurant Foods
Technical Artist/ 3D Artist/ Scene Design




As an international student, it's hard not being able to eat the food from my hometown. So, for this Game 722 Materials course, I want to make some of my hometown’s dishes. This project is divided into two parts: working with original and altered materials. For the original materials part, I plan to work with raw ingredients, like raw pork, raw eggs, and raw green onion. In the altered version, I will combine these ingredients to create a finished dish.
In this project, we focus on using subsurface scattering to create objects. The scattering of light on these ingredients allows their shadows to not appear harsh or solid but instead more natural, with a subtle translucency that reflects the way light interacts with the material. This effect gives the ingredients a more realistic appearance, which is the main goal of this project—creating more lifelike materials.
Inspiration
I ultimately chose ingredients that are commonly found in traditional Taiwanese restaurants and dishes. I decided to focus on making braised pork belly (which we also call 'Kong Rou' in Taiwan), along with a classic fried egg. One of the key aspects of Taiwanese meals is that these dishes are always paired with white rice. So, for each dish, I will create both a raw version and a final cooked version, which could either be after braising or frying.
Model and UV Mapping
For the modeling part, I primarily used Maya to create the models. Since the model needs to handle higher levels of detail and potentially support displacement, I gave it more subdivisions. The UV mapping is designed to maximize the layout on the UV sheet. For certain parts, like the back of the egg, I kept the UV but reduced the resolution slightly. This way, when you view it from the front, you get a higher resolution, but when viewed from the back, the texture is still visible, just not as high resolution, which helps save on texture size.
For the rice model, I initially used photogrammetry to scan a bowl of rice. However, I later realized that photogrammetry created unnecessary indentations and deep holes, and the model was prone to breaking or having issues with the UV mapping. Even after reworking it, the results were still not ideal. So, I decided to replace it with a simple plane and used a displacement map to generate the required bumps and details.
In the initial version of the meat model, I felt that the edges were too rounded and too square, which made the texture look less realistic after applying materials. So, I used ZBrush to create a second version with better shape and detail.. Since the final version of the meat and the green onion would undergo significant deformation, I used soft selection in Maya to modify the geometry. For the meat, I made slight twists, and for the green onion, I made some folds, but I kept the original texture and UV layout intact. This way, I can still use the same UVs while applying them to the deformed objects.

Procedural material (Substance Designer)
In Substance Designer, I created procedural materials for pork, pork skin, the surface of green onions, the cross-section of green onions, raw eggs, cooked eggs, as well as raw and cooked rice. This allows for easy and efficient import into Substance Painter, enabling quicker and more convenient texturing for these materials.
I took a lot of time creating the rice material in Substance Designer. At first, I wasn’t sure how to make each layer of the rice, so I ended up adding a lot of different nodes to try and give it depth. However, I didn’t separate the gray nodes and color nodes properly, which resulted in the rice looking like it was all stuck together without any clear details.
To fix this, I used a better Tile Sampler the raw rice material, adjusting the grayscale of each rice layer with a parameter called the Color Parameterization Multiplier. This allowed me to control the depth of each layer. Then, I blended them using the Max (Lighten) blend mode to create the layered effect. In the end, for the cooked rice material, I only used four tile samplers, but I was able to create rice with clear separation and a sense of stacking, without needing a lot of nodes, and the result still looked great.
In the raw egg precision material, I started by quickly blending colors together to create a gradient effect for the egg white and yolk. Based on my observations, I found that the yolk appears more yellow around the edges and more orange in the center. With this in mind, I made sure the yolk had a smooth transition between these colors. The egg white near the yolk looks a bit yellow, while the outer part is more transparent and white. After mastering these principles, I was able to quickly create a realistic raw egg effect.
However, I felt like something was missing, so I decided to add the fine details from my reference image of a raw egg. I used parallax height increase specifically to add inward detail to the fine lines around the yolk. These lines resemble the veining that appears on the egg white near the yolk.
To generate these details, I used a splatter circular grayscale method to create radial lines pointing inward. Then, I added some directional warp to distort them, simulating the veins that extend from the egg white into the yolk. Finally, I used a mask to cover about two-thirds of the area, leaving a third exposed, and added some white lines in the center to further detail the texture. I applied this directly to the height map, and then blended in another color with a mask to apply the final touches to the egg. I also added a bit of opacity to make the yolk less transparent and the egg white more transparent, enhancing the realism of the egg.
Smooth out texture seams (Substance Painter)
In Substance Painter, I mainly focus on two tasks. The first is removing texture seams on the model. Due to the UV mapping, the model has seams that can make it look unrealistic. I work to smooth out these seams to achieve a more seamless and natural appearance. The second task involves creating food materials and turning them into a cooked version. For the cooked version, I adjust the color parameters, add some indentation marks and details, and adjust the Roughness, as cooked food would have light reflections.
When handling the texture seams on the model's UV, I created a Paint layer (Step 1). For this layer, I set all the channel's blending modes to Passthrough (Step 2). Then, I used the Clone tool (Step 3) to select the area I wanted to use. By pressing the V key (Step 4), I can activate that selected range and move my brush to paint over the seams, filling them in. This allows me to use the selected area to seamlessly cover the gaps in the texture.
Create cooked in (Substance Painter
In the cooked version of the green onions, I first used the soft selection tool in Maya to select the points and apply some twisting and deformation. Then, I returned to Substance Painter and created a basic soy sauce material as a full layer. On this material, I applied the four channels: Color, Height, Roughness, and Scattering. I chose a coffee-brown color to resemble soy sauce, gave it a slight bump in the height, reduced the roughness to make it more reflective, and set the scattering to 1 to make it fully bright.
Next, I created an empty folder and applied a mask to it. I used the Chrome Pro mask, which calculates the lower areas and applies the soy sauce to those spots. This way, it gives the effect of the green onionsbeing soaked in the sauce, with some of the sauce settling in the lower parts of the green onions, making it look more realistic.
Material Graph (Unreal Engine)
In the Unreal Engine, there are mainly two material settings. One is the SubSurface scattering Basic (SSS Basic), and the other is SubSurface scattering with the Parallax function as the Height map display method (SSS POM).
In the "SSS Basic" Material, I used the "Power" node to connect the BaseColor and SubSurfaceColor. When adjusting its parameters, if I lower the value, I can display more of the SoftSurfaceColor I set. On the other hand, if I want to maintain more of the BaseColor, I can increase the value, which allows the SoftSurfaceColor to be more influenced by the BaseColor, without losing the details from the BaseColor.
Additionally, I connected the opacity to reflect the impact of SoftSurface. I placed the SoftSurfaceScattering texture here and used a "CheapContract" node to adjust how much the object is affected by the SubSurfaceColor. For the HeightMap, I directly connect it to Displacement channel. For the Normal, I applied a FlattenNormal, so I can easily adjust the strength of the normals. If the Normal value is closer to negative values, it will become stronger (closer to -1), while if it's closer to positive values (close to 1), it becomes weaker.
For other properties like Ambient Occlusion, Roughness, and Metallic, I used an ARM texture map to combine the texture resources and assign them to the corresponding RGB channels. Finally, I used Capture Coordinates to adjust the texture's tiling.
SSS POM Material
In the Parallax material, there are two main features that stand out. The first is that its height display uses the Parallax method, and I used a special node called ParallaxOcclusionMapping. When this node is applied, it takes the Height Map (texture Object) , and then applies it to the Normal Map's UV. Finally, it connects to the Normal channel, the ParallaxOcclusionMapping node also offer some parameters which adjust the height scale and sampling values.
Additionally, My opacity is linked to a Fresnel node, which has the ability to use a Lerp to adjust the gradient, creating a smooth transition from outside to inside, or vice versa. This allows me to achieve an effect where the outer edges are more transparent, and the inner part is more solid in terms of transparency. I then combine this with the opacity texture to create a dual effect. This way, I can control the opacity gradient, with a smooth transition from inside to outside, while also maintaining the texture of the opacity itself.
SSS POM Material
When I finished adjusting all the settings and applied the material to the egg, I encountered a significant issue. Even though the egg had transparency, a nice parallax height effect, and the yolk feeling, it lost its reflective and refractive properties. It no longer reacted to environmental light sources, making it look flat and unrealistic. To solve this, I made some adjustments to the material. I changed the reflection setting from the original pixel normal offset to index of refraction (IOR). After this change, the pixel depth offset in the parallax occlusion mapping no longer worked, as it was essentially canceled out. However, this adjustment restored the reflection and the way the material interacted with environmental light. I’m satisfied with this version now, so I decided to use it as the final one.
Final Render (Unreal Engine)
I've really enjoyed in the entire pipeline, from creating the model to observing and creating materials, and then fine-tuning every parameter, such as roughness, subsurface scattering, and understanding how details like the model's UV mapping affect the final material display. I also learned how to more cleverly use these nodes in Designer, and how to apply various tools in Substance Painter to enhance the materials from Designer. Finally, applying everything to the array allowed the materials to come to life, making them appear as realistic as possible.
Thank you to Professor Manuel Prada for guiding us through this professional pipeline, allowing us to go step by step and understand in detail how each setting influences the final result. Also, a big thanks to my classmates who stayed up with me. Your advice on aesthetics, especially when I was exhausted and unclear, was greatly appreciated.
Credit
Music: Robert Munzinger - Blue Mood