Resource pack



The resource pack system provides a way for players to customize textures, models, music, sounds, languages, texts such as the end poem, splashes and credits, and fonts, without any code modification.

Behavior
Resource packs can be placed in the folder  within the   folder. Each resource pack is either a sub-folder or a  file within the   folder. Once in the folder, a resource pack can be added from the options, where resource packs can be moved between "Available resource packs" and "Selected resource packs". "Selected resource packs" also contain the default assets on the bottom, which cannot be removed.

Resource packs load their assets based on the order of the packs on the list. The bottom-most pack loads first, then each pack placed above it replaces assets of the same name with its assets.

Default resource packs
A resource pack can be bundled with a world by saving it under the name  and placing it directly in the world's folder. When playing the world, that resource pack appears as the default right above the default resource pack. A default resource pack can also be set on a server by adding a link to a  file download after the line   in the server properties file. Users can still opt out of using the resource pack or choose not to download it, however.

The old (pre-1.14) textures are available in a resource pack titled "Programmer Art". These textures are not updated when the game receives new textures.

Folder structure
More than one directory for different namespaces may exist under the directory.

Contents
A resource pack is identified by Minecraft based on the presence of the file  in the root directory, which contains a JSON file with the following information:


 * The root tag
 * Holds the resource pack information
 * Pack version. If this number does not match the current required number, the resource pack displays an error and required additional confirmation to load the pack. Requires  for 1.6.1–1.8.9,   for 1.9–1.10.2,   for 1.11–1.12.2,   for 1.13–1.14.4,   for 1.15–1.16.1,   for 1.16.2–1.16.5, and   for 1.17.
 * : Text shown below the pack name in the resource pack menu. The text is shown on two lines. If the text is too long it is truncated.
 * : Contains a raw JSON text object that is shown instead as the pack description in the resource pack menu. Same behavior as the  version of the   tag, but they cannot exist together.
 * : Contains additional languages to add to the language menu
 * Language code for a language, corresponding to a .json file with the same name in the folder assets//lang.
 * : The full name of the language
 * : The country or region name
 * : If true, the language reads right to left.

The root directory also contains an optional image called pack.png, which appears as the thumbnail for the pack on the resource pack selection menu.

Language
Resource packs can create language files of the type  in the folder. Each file either replaces information from a file of the same name in the default or a lower pack, or it creates a new language as defined by.

Each line in the  file is in the standard json format of   followed by a comma in case it is followed by another value in the next line. is the name that the game looks for to determine the name for something, and as such it should not be changed. is the name that is displayed. For example, stone in the default language file is, with   being the identifier, and   being the displayed name. Blank lines are ignored. The file needs to be valid JSON syntax, meaning it starts with a, has a comma after every key value pair except the last one, and ends with a.

Language files need to add only those lines that are changed by the pack. Any names that are not in the pack are loaded from the pack below, or default if no pack changes the names.

Models
Models are files in JSON format with the extension, which determine the shape and textures of blocks and items.

Blocks use a block state file from  to determine which model is loaded for each variant from the folder. Meanwhile, each item has an item model in  to determine its model, which either loads from a block's model, contains data for its own custom model, or uses the default "flat" or "entity" model.

Models and block states used in packs below the top one are still loaded unless overridden in the top pack, which may cause some textures and models used by the top pack to no longer be loaded.

Sounds
Resource packs load additional sounds with the file type of. Each sound placed in the pack overrides the sounds from packs below, and packs also contain a file called  which is placed within. Unlike most other files in resource packs,  merges sound information from packs below the top pack, rather than each   file overriding the previous completely.

Textures


For block or item textures to function, they must have equal width and height (or height that is a multiple of the width if animated); otherwise it appears as a magenta and black checkerboard. For most other textures, the file is stretched to fit the required dimensions.

Most solid blocks turn any transparent area fully opaque. Some other blocks, which have "cutout" transparency (like glass) turn all pixels that are less than 10% opaque fully transparent and all other pixels completely opaque. Every other block renders textures with semi-transparency as-is. All items and any blocks or entities which are semi-transparent by default support semi-transparency.

If a file does not exist in any resource pack, including the default, it appears as a magenta and black checkerboard texture using the colors ( and ).

Animation
Block and item textures support animation by placing each additional frame below the last. The animation is then controlled using a  file in JSON format with the same name and   at the end of the filename, in the same directory. For example, the  file for   would be.


 * The root tag
 * : Contains data for the animation
 * : If true, Minecraft generates additional frames between frames with a frame time greater than 1 between them. Defaults to.
 * : The width of the tile, as a direct ratio rather than in pixels. This is unused in vanilla's files but can be used by resource packs to have frames that are not perfect squares.
 * : The height of the tile in direct pixels, as a ratio rather than in pixels. This is unused in vanilla's files but can be used by resource packs to have frames that are not perfect squares.
 * : Sets the default time for each frame in increments of one game tick. Defaults to.
 * : Contains a list of frames. Defaults to displaying all the frames from top to bottom.
 * A number corresponding to position of a frame from the top, with the top frame being 0
 * A frame specifies a frame with additional data
 * : A number corresponding to position of a frame from the top, with the top frame being 0
 * : The time in ticks to show this frame, overriding "frametime" above.

If the  file does not exist in the pack and the texture does, the game assumes the texture is not animated, rather than loading a   file from a pack below that pack. If no  file exists for a texture with unequal dimensions, the texture appears as a purple and black checkerboard.

Villagers
Textures from  and   support a   file in JSON format containing additional effects to apply to the hat layer. The file is contained in the same directory as the texture, and has the same name as the texture, except appended with. For example, the file  can have a properties file called


 * The root tag
 * : Contains data for the texture
 * : Whether the villager type's hat layer should still render (default), or not full.

If the  file does not exist in the pack and the texture does, the game loads the default settings, rather than loading a   file from a pack below that pack.

Colormaps
Colormaps are 256×256 pixel images which tell the game which color to use in each biome. They are located in. The game contains two colormaps,  which colors plants such as leaves (except birch and spruce) and vines, and   which colors grass and grass blocks. Colormaps can be disabled on individual blocks by removing the  tag from the block model.

Properties

 * Textures from  support a   file in JSON format containing additional effects to apply to the texture. The file is contained in the same directory as the texture, and has the same name as the texture, except appended with  . For example, the file   can have a properties file called


 * The root tag
 * : Contains data for the texture
 * : Causes the texture to blur when viewed from close up. Defaults to
 * : Causes the texture to stretch instead of tiling in cases where it otherwise would, such as on the shadow. Defaults to
 * : Custom mipmap values for the texture

If the  file does not exist in the pack and the texture does, the game loads the default settings, rather than loading a    file from a pack below that pack.

Texts
Three  files in UTF-8 format exist in   which are used by the game to determine the text to display.

The file  contains the text of the end poem, using formatting codes to apply the colors to the two speakers, and with the text   being replaced with the player's name. After that file is shown, the contents of  are shown.

The file  contains lines of text separated using line breaks to determine the splashes to display in-game. Any splash can be replaced with different text.

Fonts
A font file is a JSON file located at  within a resource pack and contains a list of providers that each tie a character set to a resource location along with some extra information. The default font is defined by the font  while the default font used by enchantment tables is defined by the font. The resource locations given in font providers should also include the file extensions.


 * The root tag
 * : A list of providers that are merged onto this font.
 * A font provider. The contents depend on the value of the  tag.
 * : The type of the font provider. Can be one of the following:
 * bitmap: A bitmap font.
 * : The resource location of the used file, starting from.
 * : Optional. The height of the character, measured in pixels. Can be negative. This tag is separate from the area used in the source texture and just rescales the displayed result. Default is 8.
 * : The ascent of the character, measured in pixels. This value adds a vertical shift to the displayed result.
 * : A list of strings containing the characters replaced by this provider, as well as their order within the texture. All elements must describe the same number of characters. The texture is split into one equally sized row for each element of this list. Each row is split into one equally sized character for each character within one list element.
 * legacy_unicode: A legacy unicode font. This format is deprecated and only prioritized when the "Force Unicode Font" option is turned on.
 * : The resource location inside  describing a binary file describing the horizontal start and end positions for each character from 0 to 15. The file extension of the target file should be.
 * : The resource location inside  that leads to the texture files that should be used for this provider. The game replaces   from the value of this tag with the first two characters of the hex code of the replaced characters, so a single provider of this type can point into multiple texture files.
 * ttf: A TrueType font.
 * : The resource location of the TrueType font file within.
 * : The distance by which the characters of this provider are shifted.
 * Left shift
 * Downwards shift
 * : Font size to render at.
 * : Resolution to render at.
 * : String or array of strings to exclude.

Font texture sheets will automatically be resized based on the amount of characters in each array line, and some sheets may use a 16-character wide sheet, in order to conform with a Unicode block.

Default textures
The texture files of the default fonts contain a grid of white characters, which are automatically colored by Minecraft as needed in-game. The character sizes are automatically determined based on the last line of pixels containing any alpha value. Due to the way fonts are detected, filling the background of a character with a color containing a 5% alpha background causes the full width to render without generally having a visible background to the character. The default font character is 8×8 pixels, while  is 18×18 pixels.


 * Glyphs 0x20 (space) through 0x7E (tilde) display the standard ASCII characters
 * Glyphs 0x7F through 0xFF (y with diaeresis) display the Code page 437 characters

The default texture is located in. It contains these non-script characters:

░ ▒ ▓ │ ┤ ╡ ╢ ╖ ╕ ╣ ║ ╗ ╝ ╜ ╛ ┐ └ ┴ ┬ ├ ─ ┼ ╞ ╟  ╚ ╔ ╩ ╦ ╠ ═ ╬ ╧ ╨ ╤ ╥ ╙ ╘ ╒ ╓ ╫ ╪ ┘ ┌ █ ▄  ▌▐▀ ≡ ± ≥ ≤ ⌠ ⌡ ÷ ≈ ° ∙ · √ ⁿ ² ■

A texture sheet in  contains many accented characters and most of the symbols Minecraft supports. It contains these non-script symbols:

⧈ ⚔ ☠ ¢ ¤ ¥ © ® µ ¶ ¼ ½ ¾ · ‐ ‚ † ‡ • ‱ ′ ″ ‴ ‵ ‶ ‷ ‹ › ※ ‼ ‽ ⁂ ⁈ ⁉  ⁋ ⁎ ⁏ ⁑ ⁒ ⁗ ℗ − ∓ ∞ ☀ ☁ ☈ Є ☲ ☵ ☽ ♀ ♂ ⚥ ♠ ♣ ♥ ♦ ♩ ♪ ♫ ♬ ♭ ♮ ♯ ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ ʬ ⚡ ⛏ ✔ ❄ ❌ ❤ ⭐ ⸘ ⸮ ⸵ ⸸ ⹁ ⹋ ⥝ ᘔ Ɛ ⅋ ⏏ ⏩ ⏪ ⏭ ⏮ ⏯ ⏴ ⏵ ⏶ ⏷ ⏸ ⏹ ⏺ ⏻ ⏼ ⏽ ⭘ ▲ ▶ ▼ ◀ ● ◦ ◘  ⚓ ⛨ � ☺ ☻ ¦ ☹ ⅔ ✉ ☂ ☔ ☄ ⛄ ☃ ⌛ ⌚ ⚐ ✎ ❣ ♤ ♧ ♡ ♢ ⛈ ☰ ☱ ☳ ☴ ☶ ☷ ↔ ⇒ ⇏ ⇔ ⇵ ∀ ∃ ∄ ∉ ∋ ∌ ⊂ ⊃ ⊄ ⊅ ∧ ∨ ⊻ ⊼ ⊽ ∥ ≢ ⋆ ∑ ⊤ ⊥ ⊢ ⊨ ≔ ∁ ∴ ∵ ∛ ∜ ∂ ⋃ ⊆ ⊇ □ △ ▷ ▽ ◁ ◆ ◇ ○ ◎ ☆ ★ ✘ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₋ ₌ ₍ ₎ ∫ ∮ ∝ ⌀ ⌂ ⌘ 〒 ɼ

A secondary texture is located in. It supports most basic accented characters, greek letters, cyrillic characters, as well as some enclosed alphanumerics and other symbols. Aside from non-symbols, it contains these characters:

⚠ ⓪ ① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ ☯ ☐ ☑ ☒ ⅒ ⅘

The default texture used when displaying the enchanting "alien font" is.

Legacy Unicode
As a fallback for untextured characters, Minecraft uses GNU Unifont. Each sheet of characters is stored following the format of, where ## are the hexidecimal numbers 00 through FF. These pages are 16x16 pixels, and appear small and rough in-game. They are not aligned left-most correctly, and the version of Unifont used is v8.0, and is outdated as of 1.16.5. It provides the support for the CJK characters as well as other scripts.

Emojis
Since 1.15, Minecraft can support UTF-16 sequences for emojis, or any character in the Unicode SMP plane. To insert the character into the sheet, you can either split the UTF-16 codepoint into two UTF-8 codepoints (surrogates); for example,, or insert the emoji character directly. The first method is used in the standard font file, but either work equally well. To convert a character into a surrogate pair, you can use this tool, or calculate the pair yourself, where C is the codepoint in decimal.


 * High Surrogate: $(C − 65536) / (1024 + 55296)$
 * Low Surrogate: $C − 65536$

As of 1.16, Minecraft has default support for the following emojis: 🌧 🔥 🌊 🗡 🏹 🪓 🔱 🎣 🧪 ⚗ 🛡

Texture sheets
Minecraft generally does not store multiple different textures on sheets and instead stores them on separate files. Two current exceptions are map icons and experience orbs as well as minecarts.

Shaders
Shaders are GLSL files that are compiled when loaded. They are used to modify the look of the game and come in two varieties, vertex and fragment. The vertex shaders modify the positions of individual vertices and are most often used to create waving foliage and water. Fragment shaders are applied to every pixel and can be used to add effects like bloom, god rays, and blur. The folder contains JSON files which link to the vertex and fragment shaders and provide info about them. Note that without mods, you cannot normally pick a specific shader to load. If any error occurs when loading the shaders, the resource pack is unloaded and fabulous graphics are turned off.

Here's the process of how a shader is used in game: first, the shader initializes all of the render targets specified in the "targets" list with the proper width and height. After that, the shader goes through each render pass specified in the "passes" list from first in the list to last in the list. Each pass will apply the program shader on the render target specified by "intarget" (with any extra data provided by other auxiliary render targets) and output the end result on the render target specified by "outtarget." The  render target will be the final output to the screen.

"Post" JSON

 * The root tag
 * : A list of render targets. It doesn't really matter what name you give them, but it is necessary for specifying the  and   of a render pass.
 * : The name of a render target. The size defaults to screen resolution.
 * : A render target to add.
 * : The name of the render target to add.
 * : The width of the render target.
 * : The height of the render target.
 * : A list of passes.
 * : A render pass.
 * : The name of a program shader to apply on the input and post into the output. Use "blit" to copy the data from intarget to outtarget.
 * : The name of a render target to use as an input. Use  to specify the main screen.
 * : The name of a render target to output to. It should not be the same as intarget. Use  to specify the main screen.
 * : A list of auxiliary targets.
 * An auxiliary target.
 * : The auxiliary target's name that is passed into the "Program" JSON.
 * : The auxiliary target's id. Either points into the name of a buffer that is defined in  or into the location of a texture under   (use a namespaced id to reference it).
 * : Required if  references a texture. Describes the width of the texture in pixels.
 * : Required if  references a texture. Describes the height of the texture in pixels.
 * : Required if  references a texture. Determines whether the scaling algorithm used for the image is bilinear or nearest neighbour.
 * : A list of overrides that change the values in the  list in the "Program" JSON.
 * : A uniform.
 * : The name of the field that should be changed.
 * : The values that the field should be changed to.

"Program" JSON

 * The root tag
 * : Settings for OpenGL blending.
 * : Operator to be used when blending. Can be,  ,  ,  ,  , or  . Not case sensitive. Defaults to  . Used as   parameter of
 * : Used as  parameter of   or   parameter of  . Can be ,  ,  ,  ,  ,  ,  ,  ,  , or . Case insensitive. Ignores "_". "1", "0", "-" can be replaced by "one", "zero", "minus".
 * : Used as  parameter of   or   parameter of  . Can be ,  ,  ,  ,  ,  ,  ,  ,  , or . Case insensitive. Ignores "_". "1", "0", "-" can be replaced by "one", "zero", "minus".
 * : Used as  parameter of  . Can be ,  ,  ,  ,  ,  ,  ,  ,  , or . Case insensitive. Ignores "_". "1", "0", "-" can be replaced by "one", "zero", "minus".
 * : Used as  parameter of glBlendFuncSeparate. Can be ,  ,  ,  ,  ,  ,  ,  ,  , or . Case insensitive. Ignores "_". "1", "0", "-" can be replaced by "one", "zero", "minus".
 * : If true, run . If false, run  . Defaults to true.
 * : The name (without file extension) of the vertex shader to be used.
 * : The name (without file extension) of the fragment shader to be used.
 * : Attributes to be used by the vertex shader.
 * : An attribute. The only currently available value is.
 * : A list of samplers that may be used in the shaders.
 * : A sampler.
 * : The samplers name.
 * : A list of uniforms that can be used in the shaders.
 * : A uniform.
 * : The name of the uniform as referenced in the GLSL code. Some names give a uniform special behavior:
 * Time: A value from 0 to 1, representing time in seconds. Resets every second.
 * InSize: The width and height of the input buffer in pixels.
 * OutSize: The width and height of the output buffer in pixels.
 * : The type of the uniform. Can be one of,  ,  ,   and  .   can also be interpreted as  ,   or   depending on how many values are actually included in  .   can also be interpreted as  ,   or   depending on how many values are actually included in.
 * : The number of values included in.
 * : The value of the uniform, given as a list of floats. The length of the list should be the same as.
 * : The value of the uniform, given as a list of floats. The length of the list should be the same as.

Template
The folder structure of Vanilla Resource Pack:

Bedrock Edition
Similarly to skins, resource packs can be bought or made $$. As of Alpha 0.15.0, iOS users can download resource packs on the system itself with the  and   file names. When these files are opened, they are automatically imported into the game without any need for file system access.

Trivia



 * The old pack.png file was screenshotted from Alpha v1.2.2, the seed being.
 * The screenshot was taken approximately at X=49.16, Z=0.72, facing RX=-119.23, RY=-8.297.
 * How to generate the exact same world and make the exact same screenshot: https://pastebin.com/CmsEKDev.