CS348b Project Writeup: Volumetric Texturing

Andreas Edlund and Tim Chao


In our project, we applied the volumetric texturing technique described by Kajiya and Kay's 1989 SIGGRAPH paper to the task of rendering realistic fur and grass. See our proposal here


We referred to several different implementations of volumetric texturing. We found it useful to base our approach on the texture description files generated by Adrian Skilling's texel renderer. The texel description files we use allow the user to specify density, height, length, and color. We also allowed the user to specify in this file the number of texels to map to one geometric primitive in the x, y, and z texel coordinates. Using this texture file to specify this is admittedly slightly awkward and this feature could (and probably should) be moved to the scene (.rib) file so that the same texel can be mapped in multiple ways. Still, this allows us more flexibility in mapping texels and comes in handy when rendering simple primitives (like a large plane of grass). Unfortunately we did not allow for mapping many primitives to one texel which would be handy in the opposite case of rendering complicated shapes.

The texels need to be mapped into world space. All of our geometry are trianglemeshes and every triangle on such a mesh is is mapped to one texel. We first compute the normals for each vertex by averaging over all the adjacent triangle normals. Then we extrude the triangle along it's three computed normals.

So the triangle becomes a threedimensional block that is mapped to the texel. Only four points are necessary to produce a linear mapping between texture space and world space. But we have six points so in order to simplify the mapping we divide the block into three tetrahedrons (specified by four points) and that way we can use a linear transform to map between the to spaces.

Each of these blocks are given back to the system through the refine() function of FurMesh. The intersections are then handled by triangulating each side of the block and then instersect with each triangle in turn.

A fur material class was created to parse the texture description file. The material class is associated with a particular volumetric triangle mesh. Through this class, the user can specify the texel used, the specular/diffuse properties of the texel rendering, and the bsdf properties of the fur base.

A volumetric integrator was created to map the material properties specified by the fur class to the volumetric triangle mesh. We essentially follow Kajiya and Kay's algorithm here, but make some changes in order to fit as well as possible with the lrt model.

Trying to keep the interface with LRT was no easy task, as many of the primitives used did not correspond well with volumetric rendering. For example, the intersection primitives provide little flexibility when attempting to intersect volumes.


These are some of our first images. We map our texels onto a small plane consisting of a two triangle volumetric mesh. This gives us a closeup look at our texels.

Here are some texels mapped onto a curved triangle mesh. We rendered a version in which the base was opaque to see what it would look like as actual fur on an animal. We rendered another version with a transparent base, allowing us to see the volumetric texturing exclusively.

Here is the same curve when viewed from above. Kinda looks like animal fur... We really liked the furry meteor looking object on the right.

We built a bear model in Maya and exported a traingle mesh in .rib format. We used two different texel description files to specify different texels for use in the grass and fur. The images are lighted by a directional light source. Click to see larger images.

Future Work:

Give teddy bear a face


Kajiya and Kay, "Rendering Fur With Three Dimensional Textures." California Institute of Technology, Computer Graphics, Volume 23, Number 3, July 1989.

Skilling, Adrian. "Rendering Fur with Texels." (http://dspace.dial.pipex.com/adrian.skilling/texels/texels.html)