Skip to content

dh.texture

Extension: .dh-texType ID: dh.texture

Texture definitions describe compile-time texture operations. The compiler processes them during dh build — runtimes just load the pre-baked results.

Two modes: channel packing (pack) or single source (source). They’re mutually exclusive.

PropertyTypeRequiredDescription
$type"dh.texture"noType identifier
namestringnoDisplay name
descriptionstringnoDescription
packobjectone ofChannel packing map (mutually exclusive with source)
sourcestringone ofSingle source texture path (mutually exclusive with pack)
size[w, h]noTarget dimensions. Omit to keep original size.

The type is inferred from the file extension — $type is not needed in source files. The compiler adds it automatically during builds.

Combine channels from multiple source textures into a single output. Classic use case: ORM (Occlusion, Roughness, Metallic) packing.

body-orm.dh-tex
{
"name": "Body ORM",
"pack": {
"r": "textures/occlusion.png@r",
"g": "textures/roughness.png@r",
"b": "textures/metallic.png@r"
}
}

Each key is an output channel (r, g, b, a). Each value is a texture reference with optional @channel suffix.

Defaults for unspecified channels:

  • RGB channels → 0 (black)
  • Alpha channel → 255 (fully opaque)

Process one texture — resize it or reference a single source:

body-diffuse-1k.dh-tex
{
"name": "Body Diffuse (1K)",
"source": "textures/body-diffuse.png",
"size": [1024, 1024]
}

If only one dimension is given in size, the other is calculated to preserve the aspect ratio.

The @channel suffix extracts a single channel from a source texture. This works anywhere texture paths are used — in pack values, in source, and in material texture references.

SyntaxResult
textures/packed.pngFull RGBA texture
textures/packed.png@rRed channel as grayscale
textures/packed.png@gGreen channel as grayscale
textures/packed.png@bBlue channel as grayscale
textures/packed.png@aAlpha channel as grayscale

Works with cross-pallet barcodes too:

io.mltn.base:textures/packed-orm.png@r

The @ separator was chosen because it can’t appear in file paths and doesn’t conflict with : used for pallet references.

body-orm.dh-tex
{
"name": "Body ORM",
"pack": {
"r": "textures/body-ao.png@r",
"g": "textures/body-roughness.png@r",
"b": "textures/body-metallic.png@r"
}
}
body-diffuse-mobile.dh-tex
{
"name": "Body Diffuse (Mobile)",
"source": "textures/body-diffuse-4k.png",
"size": [512, 512]
}
decal.dh-tex
{
"name": "Decal with Transparency",
"pack": {
"r": "textures/decal-color.png@r",
"g": "textures/decal-color.png@g",
"b": "textures/decal-color.png@b",
"a": "textures/decal-mask.png@r"
}
}