Directory packs and `.zip` packs in the game `shaders` folder are scanned.
Sulkan Shader Pack API
This is the technical contract for shader pack creators targeting Sulkan. Use it as the primary compatibility reference for layout, bindings, and rendering passes.
Pack layout rules
Sulkan accepts both direct namespaced packs and shorthand shader folders.
`assets/sulkan/shaders/...` is native. `shaders/...` is accepted and remapped into the Sulkan namespace during staging.
`pack.png` is preserved if present.
Entries without a Sulkan shader layout are ignored and treated as unsupported rather than partially loaded.
shader-pack.zip
|- pack.png
|- shaders/
| |- core/
| | |- water.vsh
| | |- water.fsh
| | |- terrain_shadow.vsh
| | |- terrain_shadow.fsh
| | |- shadow_depth.vsh
| | |- shadow_depth.fsh
| | |- entity_shadow.vsh
| | |- entity_shadow.fsh
| | |- entity_shadow_depth.vsh
| | |- entity_shadow_depth.fsh
Core shader program set
These are the expected program names used by the Sulkan rendering pipeline.
| Program | Role | Notes |
|---|---|---|
core/water |
Water vertex and fragment pipeline | Handles wave displacement, water normals, tinting, refraction, and screen-space reflection behavior. |
core/shadow_depth |
Terrain shadow caster | Used by solid and alpha-cutout terrain caster pipelines. |
core/terrain_shadow |
Terrain shadow receiver | Consumes terrain cascade depth plus dynamic entity shadow depth for shaded terrain output. |
core/entity_shadow_depth |
Entity shadow caster | Used for solid, cutout, and translucent casting variants. |
core/entity_shadow |
Entity shadow receiver | Supports overlay, lightmap, shadow cascades, and optional per-face/translucent variants. |
Uniform blocks and sampler slots
These names are significant because Sulkan uses explicit binding contracts across its render pipelines.
ShadowMatrices
Terrain caster uniform block containing the active shadow projection-view matrix plus shadow direction and parameter vectors.
TerrainShadowSplits
Receiver block containing up to four cascade projection matrices, split ranges, sun direction, strength, floor, and transition parameters.
EntityShadowMatrices
Entity block carrying the entity shadow transform and inverse view rotation matrix needed to recover receiver-space orientation.
WaveUniforms
Water animation block. In the current runtime, `WaveData.x` acts as animation time in seconds.
| Binding | Name | Purpose |
|---|---|---|
1 |
Sampler1 |
Overlay sampler for entity receivers. |
3 |
Sampler3 |
Water scene color sampler used for refraction and reflection sourcing. |
4, 6, 7, 8 |
Terrain shadow depth samplers | Cascades 0 through 3 for terrain receiver shading. |
5 |
Sampler5 |
Water scene depth sampler for SSR, thickness, and refraction depth testing. |
9 |
Sampler9 |
Dynamic entity shadow depth sampler. |
Authoring expectations
Treat these as runtime-level behavior guarantees when creating or adapting shader packs.
Expect up to four active terrain cascades, with runtime blend between cascade ranges and dynamic adjustment based on quality preset and render distance.
Expect three terrain receiver cascades plus one short-range dynamic entity shadow depth source.
Water shaders can rely on animated displacement, derived wave normals, screen-space reflection tracing, depth-aware thickness, and fog integration.
Both terrain and entity caster and receiver paths include alpha-cutout variants controlled by compile-time defines.
What pack authors should not assume
These boundaries help avoid fragile integrations and maintain forward compatibility.
- Do not assume undocumented internal Java classes are part of the public authoring API.
- Do assume bind names, file entry points, and quality semantics are the meaningful compatibility layer right now.
- Do not assume arbitrary foreign shader-pack layouts will be partially adapted. Sulkan expects a Sulkan-targeted pack structure.
- Do assume future revisions may extend the API, but current packs should target the observed core program set and named uniform contracts.