Manifest reference

Fields accepted by sulkan.json in native format 1, with defaults and constraints.

Sulkan 0.5.1 · Minecraft 26.3 · Native format 1

Required root fields

Use JSON without comments or trailing commas. Unknown fields fail validation.

FieldTypeMeaning
versionintegerMust be 1
namestringPack display name
resourcesobjectNamed color images
passesarray1–128 graphics or compute passes
presentstringFinal resource name; must have a producer

See the complete minimal manifest.

Optional root fields

FieldDefaultMeaning
budgetMiB512Integer 1–2048 MiB, active-generation budget
optionsemptyNumeric defines and settings choices
texturesemptyPNG assets or $minecraft/clouds
buffersemptyNamed storage buffers
sceneTargetsemptyUp to 7 full-resolution scene attachments
sceneProgramsemptyPipeline selectors and shader pairs
materialsemptyBlock/state selectors mapped to IDs 1–65535
shadowsfalseOpt into the shared shadow producer
environmentboth falsesky and clouds ownership booleans

Environment ownership lets a ready pack suppress corresponding vanilla rendering. It does not generate sky/cloud effects automatically; the pack supplies them.

Image resources

{
  "resources": {
    "hdr": { "format": "RGBA16_FLOAT", "scale": 0.5 },
    "history.color": { "format": "RGBA16_FLOAT", "history": true },
    "volume": { "format": "RGBA16_FLOAT", "size": [32, 32, 16] },
    "display": { "format": "RGBA8_UNORM", "mipmaps": true }
  }
}
FieldDefaultConstraint
formatrequiredSupported color GpuFormat enum name
scale1Relative viewport scale in (0, 2]
sizeomitted[width,height,depth]; use instead of scale
historyfalseAllocate previous-frame storage
mipmapsfalseAllocate a complete mip chain

Fixed width/height are 1–16384; depth is 1–2048, also limited by the device. Depth greater than 1 creates a 3D image and requires a compute writer. At most 256 images are allowed.

Common formats are RGBA8_UNORM, RGBA16_FLOAT, RGBA32_FLOAT, and R32_FLOAT. Integer intermediates are allowed, but present must be a normalized/floating-point 2D image.

Mips count toward memory. They are generated after the producer; attachments and storage writes address mip 0. Formats without supported blits fail validation.

Options

{
  "options": {
    "EXPOSURE": { "label": "Exposure", "default": 1.0, "values": [0.5, 1.0, 1.5, 2.0] },
    "FIXED_GAIN": 1.25
  }
}

Names match [A-Z][A-Z0-9_]*. Values are finite numbers. Choice lists have 1–128 entries and must contain the default. Bare numeric options have one allowed value.

Sulkan emits #define EXPOSURE … and _SULKAN_ENABLED_EXPOSURE_ (1 when positive, otherwise 0). Whole numbers become integer literals: cast to float(...) when needed. Overrides are saved per pack and compiled before activation.

Textures

{
  "textures": {
    "noise": { "source": "textures/noise.png", "filter": "linear", "wrap": "repeat" },
    "clouds": { "source": "$minecraft/clouds", "filter": "nearest", "wrap": "repeat" }
  }
}

filter is nearest (default) or linear. wrap is clamp (default) or repeat. Read a declared asset with $texture/noise in a post pass, or map a scene sampler to its declared name.

Paths and archives

All paths are manifest-root-relative and case-sensitive. Use forward slashes. Absolute paths, backslashes, .., duplicate ZIP entries, and oversized archives are rejected. Include one manifest, at root or inside one wrapper directory.

Quoted user includes resolve from the pack root. Reserved includes such as sulkan/frame.glsl are supplied by the loader.