A normal texture only has color. A texture set adds extra layers that tell Vibrant Visuals and ray tracing how the surface behaves in light: is it metal, does it glow, is it rough or polished, is it bumpy? This is called PBR (physically based rendering).
In this page you will make the ruby block shine like a polished gem, with a soft inner glow.
The files
The texture set sits right next to the texture it upgrades, with the same name:
RP/
textures/
blocks/
ruby_block.png
ruby_block.texture_set.json
ruby_block_mer.png
ruby_block_normal.pngUnlike the other pages in this section, there is nothing to apply. The game finds ruby_block.texture_set.json because it sits next to ruby_block.png, and uses it wherever that texture shows up.
The texture set file
{
"format_version": "1.16.100",
"minecraft:texture_set": {
"color": "ruby_block",
"metalness_emissive_roughness": "ruby_block_mer",
"normal": "ruby_block_normal"
}
}Each layer is the name of an image in the same folder, without the file extension.
The layers
| Layer | Required | What it holds |
|---|---|---|
color | Yes | The normal texture: RGB, or RGBA with transparency. The classic look only uses this one. |
metalness_emissive_roughness | No | The MER map. Three channels, see below. |
metalness_emissive_roughness_subsurface | No | The MERS map: MER plus a fourth channel for subsurface. Use instead of MER. |
normal | No | A normal map: fakes small bumps and dents using RGB colors. |
heightmap | No | A greyscale map of bumps: white is high, black is low. Simpler than a normal map. |
You can use normal or heightmap, never both.
The MER map
One image, where each color channel means something different:
| Channel | Means | 0 (black) | 255 (full) |
|---|---|---|---|
| Red | Metalness | Not metal, like stone or wood | Bare metal, like gold |
| Green | Emissive | Does not glow | Glows brightly |
| Blue | Roughness | Mirror smooth | Completely rough and dull |
| Alpha (MERS only) | Subsurface | Light stays on the surface | Light shines through a bit, like leaves or skin |
For the ruby: red near 0 (a gem is not metal), green around 40 for a faint glow, and blue around 30 for a polished shine.
Draw it in the same grid
The MER, normal and heightmap images match the color texture pixel for pixel. Paint them at the same size (16x16 for a block) so the shiny and glowing parts line up with the colors.
One value for the whole texture
If the whole block is the same material, skip the extra image and write the values in the JSON:
{
"format_version": "1.16.100",
"minecraft:texture_set": {
"color": "ruby_block",
"metalness_emissive_roughness": [0, 40, 30]
}
}Numbers go from 0 to 255. You can also use hex: "#00281E" for the same MER. A uniform color takes four values (red, green, blue, alpha), and a uniform heightmap takes one.
Rules that break a texture set
If any of these are true, the game skips the texture set and writes an error to the Content Log:
- There is no
colorlayer. - Both
normalandheightmapare set. - A layer points at an image that is not in the same resource pack.
- An image has the wrong number of channels.
color, MER andnormalneed 3 or 4 channels,heightmapneeds 1.
If the same image name exists as several file types, the game picks .tga first, then .png, then .jpg, then .jpeg.
Texture sets from two packs are never merged. The pack higher in the list replaces the whole set.
Vanilla uses MERS
Vanilla blocks use metalness_emissive_roughness_subsurface with a format_version of 1.21.30, and .tga images so the alpha channel holds subsurface. Copy one from the bedrock samples to see a working example.
No change in game?
Texture sets only show with Vibrant Visuals or ray tracing on. If it still looks flat, add the right capability to your resource pack's manifest.json: "capabilities": ["pbr"] for Vibrant Visuals, or "raytraced" for ray tracing.