Mountain Gravel

Material Breakdown

Hwichan Hwang


Hwichan Hwang

Material Artist


Hello everyone! My name is Hwichan Hwang.
I’m originally from South Korea I’ve been working as a 3D Environment Artist and Texture & Material Artist for over 5 years on game industry.

Goals & Inspiration

In the games industry, it’s quite common to use both artist-created textures and scanned textures.

Therefore, I want to improve my skills in texture creation so that when my textures are used alongside scanned data, they don’t seem awkward or appear to be of lower quality.

Furthermore, I developed a sense of challenge, believing that textures created by artists could achieve a realistic quality that is no less than the quality of scanned textures. With the goal of creating textures that surpass the quality of scanned data, I embarked on this material creation project.


When I’m working on texture creation, I add details from the largest to the smallest form.

Firstly, I believe the texture of an object should be immediately perceived from its inherent shape. (For example, the wrinkled texture of cloth, the shape of a carved cliff, or the wave-like texture of beach sand.) It’s like knowing whether it’s cloth, a cliff, or sand from a beach wave, even from a great distance without looking up close.

Secondly, I think the texture is further specified by the inherent color and roughness of the object. An example of this would be the glistening green leaves in the sunlight.

Thirdly, by adding weathering, I believe it’s possible to convey storytelling, making one imagine what environment this object was placed in, what happened here, and so forth.

Instances of this include dust, fingerprints on a lens surface, rust, and water streaks. I believe that all these steps together help to create a realistic and immersive texture.


When I usually collect references, I mainly use websites such as Google, Shutterstock, Alamy, and Pinterest. Personally, I’d like to recommend Shutterstock. The majority of their images are of exceptional quality, and it’s convenient to collect a variety of reference images through their associated images feature.

I use the software PureRef to organize the images I’ve collected. When structuring reference images, I typically categorize them based on major classifications such as Scale, Shape and Color & Roughness.


In this particular project, I collected individual reference images for each pebble. By doing so, I was able to observe and analyze in great detail the shapes of the pebbles, their diverse colors, and color contrasts.

I believe this meticulous observation and analysis of such details is crucial as it ultimately contributes to the quality of the texture outcome. If you only refer to references where pebbles are scattered, it becomes difficult to observe these details.


When creating the Mountain Gravel texture, I used Substance Designer to produce and arrange all the stones and pebbles.
This tool was also used in the creation of Albedo, Normal, Roughness, Occlusion, and Height Texture Maps. For rendering tasks, I utilized Marmoset Toolbag 4.

Additionally, scanned data from Mega Scan was used for minor details like small grass and dead branches.


Let me explain the process of creating pebbles. I use the ‘Cells 1’ node and ‘Tile Generator’ node to create the basic shape of the pebbles.
Then, I connect the ‘Clouds 2’ node to the ‘Blur HQ Grayscale’ node to create a blurry mask texture.

This mask texture and the pebble height texture are connected to the ‘Directional Warp’ node to make the shape of the pebbles more natural.


I connect the height texture created in the previous step to the ‘Histogram Scan’ node to adjust the contrast strongly. Then, I connect it to the ‘Flood Fill’ node and the ‘Flood Fill to Gradient’ node to create a gradient texture.

This gradient texture is then blended with the pebble height texture. For this process, I used the ‘Min (Darken)’ blending mode. An important point in this step is to adjust it so that the slopes of the four pebbles face different angles.

Also, make sure that the slopes do not converge towards the center of the pebble. This way, you can get a more dynamic Normal texture result when scattering the pebbles.


In this stage, I added details through sculpting to make it look more natural. I extensively utilized the ‘Multi Directional Warp’ node at this stage to prevent the height texture from appearing too complicated or noisy.

By using this node for the sculpting process, there is an advantage in being able to add details only to the edges or boundary areas of the pebbles without adding excessive noise to the pebble surface.


I added more details compared to the previous stage. I used the ‘Directional Warp’ node to connect the ‘Cloud 2’ and ‘Liquid’ nodes with the pebble height texture.

This way, I could create a grunge texture that adds details following the shape of the pebbles. Then, I used the ‘Slope Blur Grayscale’ node to add more details. At this stage, I adjusted the resolution of the grunge texture to a lower level to prevent the height texture from becoming too noisy.

The ‘Pebble index’ node is a custom node I created. It’s very simply constructed. This node splits the four pebbles, which are combined in one sheet, into individual images.


Since I’ll be copying the Pebble Graph I created in the previous stage multiple times to generate various shape variations, I turned it into a sub-graph for management as a single node.

Using the sub-graph function in this way allows for neater management of the Main Graph. I import the Pebble generator Graph that I created in the previous stage into the Main Graph.


I used the ‘Shape Splatter’ node to scatter the pebbles.

I made extensive use of the ‘Shape Splatter’ node because it can minimize the overlap of the pebbles, and it allows for the more convenient creation of FloodFill Series mask textures.


To minimize the overlap of pebbles, a tip is to invert the occlusion map extracted through the ‘Ambient Occlusion’ node and then connect it with the ‘Level’ node. This allows you to conveniently adjust the areas where the pebbles will be placed.

In addition, the area where pebbles were previously placed is processed as black (0). Therefore, when placing pebbles again in the next stage, pebbles will not be generated again in the black (0) area. As such, I made extensive use of these Mask maps.

Parameters that I mainly adjusted to minimize pebble overlap include ‘Scale Map Multiplier’, ‘Scale No Overlap’, ‘Size Ratio from Bg Slope’, ‘Position Random’, ‘Random Distribution: Uniform’, ‘Height Scale Random’, ‘Mask Random’, ‘Mask Random Map Multiplier’, and ‘Mask from Bg Slope’.


As previously explained, I placed the pebbles in the order of size from large – middle – small – tiny.


This is the Gravel Height texture and Random grayscale texture map that I created using the ‘Shape Splatter’ node.


From this stage, I started adding detailed damage. In this step, I actively utilized the ‘Non-Uniform Blur’ node.
The reason is that it allows me to minimize damage to the surface area of the pebbles while adding detail only to the edges or corners.


Here’s a tip when adding detailed damage: it’s better to only add this detail to the larger and middle-sized pebbles while avoiding the addition of such detail too small and tiny-sized pebbles.

When you add damage to smaller pebbles, it tends to blur the shape of the pebble, causing the texture’s readability to diminish. For very small pebbles, maintaining a clear shape of the Normal texture is more important than adding a lot of detail.

In the attached picture, the damage was only added to the areas highlighted in green, while no damage was added to the red areas.


This is a time-lapse of creating the Height texture.


I connected the Random Grayscale texture extracted from the ‘Shape Splatter’ node’s ‘Splatter Data’ to a ‘Gradient Map’ node to assign colors to various pebbles.

A tip at this stage is that while focusing on the diversity of colors is good, it’s also important to strongly adjust the contrast of color brightness.


When I add detailed color at the Basecolor stage, I typically blend it with Occlusion and Height textures, then mix that texture with Grunge textures to add detail.

Here’s a tip when creating Grunge textures: if you connect the Grunge texture and Random Grayscale texture with a ‘Directional Warp’ node, it scatters the pattern of the Grunge texture, allowing you to create a more randomized Grunge texture.

Additionally, if you connect two Grunge textures and a Height texture with a ‘Multi-Directional Warp’ node, you can create a Grunge texture with strong contrast and detail.

This type of Grunge texture is very effective when adding detail to the Basecolor texture of stones or trees with rough surfaces.


This is a slightly common trick. I added a sense of depth in shading by utilizing the ‘Dirt’ node and both the ‘Curvature Smooth’ and ‘Curvature’ nodes.

A point to be careful about at this stage is to finely adjust the blending intensity so that the contrast of the Basecolor does not stand out too much.
Since adding just a bit is surprisingly effective, it’s okay to add at a weak intensity.


For the final step, I used Megascan Data for the dead branches, leaves, and grass. I utilized the ‘Atlas Scatter’ node to distribute these resources.

As shown in the attached photo, by connecting the texture resources provided by Megascan to the corresponding input, you can easily scatter them.

The data IDs of the Megascan resources I used are as follows: ‘Sword Grass_qmehtaa2’, ‘Dead Fan Palm Debris_sdbdimh2’, ‘Plant Debris_qk5laqa2’.
While the Megascan Library has many excellent resources, I recommend the above three.



Thank you for reading this article. I am thrilled to be able to share my workflow with you. I would like to extend my gratitude to the Games Artist for reaching out to me first, and I appreciate those who have shown interest in my work process and everyone who has requested a Breakdown.

I hope this article will be helpful to all of you. Enjoying and loving your work is the key! If you have any questions or suggestions, feel free to reach out to me on my social media. I’m always here to help.