Textures¶
Textures in Datoviz are GPU-side image data used by many visuals, such as image, marker, mesh, and volume. They can be 1D, 2D, or 3D, single-channel or multi-channel, and support different interpolation and wrapping modes.
This page explains how to create, configure, and use textures in your application.
Creating a Texture¶
To create a texture from a NumPy array, use the app.texture_ND() methods (with N=1, 2, or 3):
texture = app.texture_2D(image)
You can also create an empty texture with a specified shape and upload data to it later.
Texture Dimensions¶
texture_1D(data): for 1D colormap textures or lookup tablestexture_2D(image): for standard 2D imagestexture_3D(volume): for volumetric data
Texture Parameters¶
When creating a texture, you can specify either an image, or the texture parameters:
| Parameter | Description |
|---|---|
shape |
Shape of the texture (optional if image is given). |
n_channels |
Number of channels (e.g., 1 for grayscale, 3 for RGB, 4 for RGBA). |
dtype |
Data type of the texture. Common types: np.uint8, np.float32. |
In all cases, you can also specify interpolation and address wrapping mode:
| Parameter | Description |
|---|---|
interpolation |
Interpolation mode |
address_mode |
Address wrapping mode |
Texture Formats¶
When using an image, the format is automatically inferred from its shape and dtype:
- 1-channel: grayscale or scalar field
- 3-channel: RGB color
- 4-channel: RGBA color
Datoviz supports integer and float types such as uint8, int16 and float32 arrays.
Interpolation Modes¶
Interpolation determines how texels are sampled when scaling or filtering.
| Value | Description |
|---|---|
nearest (default) |
No interpolation; use nearest texel |
linear |
Smooth linear interpolation between texels |
Address Modes¶
Address mode defines how out-of-bound texture coordinates are handled.
| Value | Description |
|---|---|
clamp_to_border (default) |
Clamp to a transparent or fixed border |
clamp_to_edge |
Clamp to the edge texel |
repeat |
Wrap around to the other side |
mirrored_repeat |
Mirror the texture across boundaries |
mirror_clamp_to_edge |
Mirror once and clamp at the edge |
Uploading data later¶
You can create an empty texture and upload data later:
texture = app.texture_2D(shape=(512, 512), n_channels=4, dtype=np.uint8)
texture.data(my_image)
You can also upload to a sub-region using an offset:
texture.data(my_tile, offset=(128, 128, 0))
Using a Texture in a Visual¶
Once created, textures can be assigned to visuals using:
visual.set_texture(texture)
Example: 2D Image¶
visual = app.image(...)
texture = app.texture_2D(image, interpolation='linear')
visual.set_texture(texture)
Example: 3D Volume¶
visual = app.volume(mode='rgba')
texture = app.texture_3D(volume_data, shape=(W, H, D))
visual.set_texture(texture)