top of page


A 3D render of a guppy fish sculpted in ZBrush. The objective was to sculpt a complex organic form, and to retopologize, texture, and render it realistically. I took on the additional challenge of a complex body pattern, which required painting texture maps in Zbrush and compositing them in Photoshop, and setting up a complex node network in Maya.

Client: Prof. Nick Woolridge
Medium: Pixologic ZBrush, Autodesk Maya (Arnold renderer), Adobe Photoshop

Format: Digital image

Audience: All

Date: December 2018

Guppy 3D render



I first created sketches to understand the rough anatomy of the male guppy, and to consider what I would need to sculpt. Guppies are translucent and their inner anatomy is somewhat visible, unless the overlying scales are coloured. Since guppies are bred to have a wide variety of colours and patterns, this also needed to be decided. These drawings from multiple views served as a study of their features, and could also be used as planar references during sculpting.

sketch compile.png


I sculpted the outer form of the fish and merged its different parts with Dynamesh. I used a custom alpha brush to add the scales, and manually adjusted where needed. There were issues with getting very thin structures like the tail to hold its form with Dynamesh, so it was treated after Dynameshing. Even still, I would like for it to be thinner. 


After modelling the outer form, I chose a pattern that covered most of the body, but was still translucent in the front end (as is common with male fancy guppies). This meant that I would need to sculpt the abdominal cavity, fin spines, and possibly the brain, but not the backbone. After looking at more references, I determined that the tail spines were too fine to sculpt.



I retopologized using ZRemesher, reducing the polycount. I then divided it a few times and projected the original dynamesh figure onto it, preserving fine details for displacement map export later. I unwrapped the UVs based on polygroups. It differentiated between forms that I previously merged, allowing me to have clean divides between the fins and body. I directed the seams to the bottom of the fish so that they wouldn’t be visible. 

Retopol and groups.png

Wireframe with coloured polygroups



In ZBrush, I used polypaint to paint textures on the sculpt, which would be exported to fit its UV maps. I knew that the guppy will have a complex pattern that required more than color variation, including transparency, reflected color, and more. I studied my reference photos and noted that these attributes often have a typical value in certain parts of the guppy pattern. For example, the guppy has black spots making up a snakeskin pattern - these spots also have a lower translucency than some of the surrounding parts. I could paint out the snakeskin pattern once, export it, and composite it on other maps to define these values. Not every pattern is so defined like this, so I would need to experiment with the maps. I decided to paint these different patterns on different ZBrush layers so they could be combined in Photoshop and tested out in render. Below are some examples of exported maps.

Scales and fins_new3Guppy bod retopol-TM
snakeskin pattern.jpg
Guppy bodGuppy bod retopol-TM_u0_v0.tif
MetalbodGuppy bod retopol-TM_u0_v0.tif

Scales and tail creases

Metallic colour pattern

Base colour pattern

Snakeskin pattern



Many attributes in the Arnold standard shader must be controlled in addition to colour to create iridescence, transparency, and metallic qualities. In Photoshop, I composited the exported maps into more complex maps, some examples below. It was interesting to tinker with this and see how the attributes interacted. I also added noise to simulate the 'glitter' appearance of guppy scales. I applied the displacement map exported from ZBrush also. 

base color map.jpg
Coat color_005.tif
coat wt_008.tif
Transmission wt.jpg

Base colour

Specular/coat colour

Specular/coat weight

Transmission weight

bottom of page