Sampling Texture Values
The following are the steps involved in accessing a specific texture value at a point
on the surface:
- Calculate the texture coordinate associated for the surface point. This can be done
by calculating a linear combination of the texture coordinates at the corners of the
face based on the information you have about where the point is inside the face.
- Decide which texture are you interested in, by examining the list of textures in
the corresponding Material instance by calling the Material::TextureCount() and Material::Texture() functions. You can get the name of a texture by calling its implementation Node::Name() function. This list can change depending on the material implementation. The default
Mudbox material has a fixed list, but materials created from custom CgFX files can
have very different texture lists.
- Since Mudbox supports layers for each texture, you next need to choose the layer
you are interested in. To do this, cast the pointer obtained in step 2 to a Node. Then cast to LayerContainer using dynamic_cast.
LayerContainer* TexturePoolToLayerContainer(TexturePool* tp) { Node* n = tp; return dynamic_cast<LayerContainer*>(n);}
- Once you have a pointer to a LayerContainer instance, you can check the list of layers and their names.
- Based on your interpolated texture coordinate, you have to select the proper tile
in the TexturePool by calling the TexturePool::Tile() function. (If the UV space of an object goes beyond the range 0-1, Mudbox uses multiple
tiles to represent each layer of a texture.) Pass in a bounding box representing the
tile you are interested in. For example, if the desired texture coordinate is 1.3,
3.4, then you would pass in a bounding box between ( 1, 3, 0 ) and ( 2, 4, 0 ). In
texture space, the third coordinate is always 0. Once you get the tile, you would
sample the texture pixel (texel) at 0.3, 0.4 within that tile.
- Once you got the texture, copy it to an Image object by calling the Texture::CopyTo() function. You can easily access the color of the needed pixel by calling the Image::ColorAt() function. Note that copying a texture to an image is a slow process, so if you want
to sample multiple surface points, it is preferable to copy the textures only once,
and cache it.