Compatibility
Minecraft: Java Edition
Platforms
90% of ad revenue goes to creators
Support creators and Modrinth ad-free with Modrinth+Creators
Details
Modern, lightweight shaders for Iris
RenderPearl is an incredibly lightweight shader pack using the latest Iris and GLSL features, aiming to deliver pleasant graphics with excellent performance on modern hardware
It is currently only tested on a Windows/NVIDIA PC. If you want to report a bug or give feedback/suggestions, the easiest way to do so is by leaving a comment on the PMC page. I rely heavily on user feedback in bug fixing and design
Trivia
This project started as a continuation of "Luracasmus Shaders" (which is why you might have seen it called "LS RenderPearl"), but modern versions share little to no code with the original project. The question remains as to whether the same shader pack remains throughout, when all parts are replaced
The name "RenderPearl" is inspired by the Bedrock Edition RenderDragon engine
Features
- Detailed, colored real-time shadows
and volumetric lightusing simple shadow mapping and BRDF reflections - Colored light index-based block light with BRDF reflections
- A wide range of almost zero-cost post-processing effects, including RCA sharpening and a variety of tone mapping operators
- SMAA - Enhanced Subpixel Morphological Antialiasing (1x)
- Lightweight high-quality anti-aliasing preserving sharpness and clarity
- Implementation based on SMAA-MC
- Dynamic Color Grading automatically adjusts exposure, black point and color balance to improve visibility and more fully utilize the display's limited range
- SMAA - Enhanced Subpixel Morphological Antialiasing (1x)
- Customizable Vanilla Ambient Occlusion
- Optionally emissive Redstone, Lapis and Emerald Blocks
- Customizable waves and water opacity
- Specular and normal map support as well as automatically generated normals and smoothness
- Built-in utility features such as light level visualization and a compass overlay
- And more...
Requirements
GLSL 4.60 / OpenGL 4.6 (might require updating graphics drivers) as well as Iris 1.8+
Tuning & The Compatibility Menu
The default configuration and all values selectable with profiles are intended to work on all systems that meet the shader pack's Requirements, though you may be able to achieve higher performance and quality by changing some of these options. Beware that some values may cause the shader pack to not compile, in which case you simply have to reset the option. These are usually marked with a ⚠
Implementation-Limited Options
-
Index Size is limited by the amound of Local Data Share memory usable per work group on your GPU. Depending on your GPU and graphics drivers, and the features enabled by the 16/8-Bit Types option, you may be able to set this significantly higher than the maximum value selectable with profiles (though there is no reason to do so if the index isn't being filled completely, usually indicated by lights flickering, as it impacts performance)
-
16/8-Bit Types uses optional OpenGL extension-provided half- and/or quarter-sized data types to reduce register, LDS and VRAM usage. Performance impact varies depending on hardware and drivers, as conversion between types has a cost, but operations with smaller types can be significantly faster
-
Trinary Min/Max performs trinary minimum and maximum operations in singular function calls using the optional
AMD_shader_trinary_minmax
OpenGL extension, which may allow generation of more optimal instruction sequences. It's recommended to use this whenever possible -
32×16-Bit Multiplication performs multiplication between 32-bit integers and integers in the 16-bit-representable range using special functions provided by the optional
INTEL_shader_integer_functions
OpenGL extension, that may be faster than regular 32-bit multiplication operators. It's recommended to use this whenever possible -
Immutable Constants marks all shader variables that can be immutable as constant, possibly enabling better optimizations. This feature is required by the GLSL specification, but still unsupported on some graphics drivers. It's recommended to use it whenever possible
Modding RenderPearl
RenderPearl's source code is intended to be modifiable and re-usable. It's written according to best practice to the best of my ability, but prioritizing performance over readability. If you have any questions about how it works, feel free to contact me on any platform
Pipeline Diagram and Buffer Formats
Version-specific editions can be found at /shaders/lib/config.glsl
in modern RenderPearl
> X marks the spot... where a write happens (in the buffer corresponding to the line)
# --Shadow & Solid Geometry--
shadow* : * ┌> shadow -X┬--*-------------------*->
gtexture : >-*-┴-----------┼--*-> gbuffers(solid) *
specular : >-*-SM----------┤ * |||| *
normals : >-*-NM----------┘ * |||| *
colortex1 : * * |||└X----------*->
colortex2 : * * ||└X-----------*->
colortex3 : * * |└X------------*->
lightIndex: >-*----------------*----X--------------*->
[Barriers]: [ | | | ]
# --Deferred Processing--
indirectDispatch : >-*--┐ ┌----X-*-------------------*-------------*->
indirectDispatchSMLit: >-*-deferred---X-*--┬----------------*-------------*->
deferredLight1 : * | * deferred1-------X-*---┐ *
deferredLight0 : * | * || deferred1_a-X-*--┐| *
colortex2 : >-*--┴-----------*--┴┼--┘||| * || *
colortex3 : >-*--------------*---┼---┘|| * || *
lightIndex : >-*-deferred_a-X-*---┼----┘| * || *
colortex1 : >-*--------------*---┴-----┴---------*-deferred2-X-*->
[Barriers] : [ | | | | ]
# --Translucent Geometry--
shadow* : >-*----┐ *
gtexture : >-*----┼> gbuffers(translucent) *
specular : >-*-SM-┤ | *
normals : >-*-NM-┤ | *
lightIndex: >-*----┘ | *
colortex1 : >-*--------X--------------------*->
[Barriers]: [ | | ]
# --Post-Processing--
indirectDispatch : * ┌---X-*--------------*--------------*--------------*--------------*--------------*->
indirectDispatchSMLit: * ├---X-*--------------*--------------*--------------*--------------*--------------*->
dcgBuffer : * ┌> composite1-X-*┐ * * * * *
colortex1 : >-*-┴---------------*┴> composite2 * * * * *
colortex0 : * * └X-*-> composite3 * * * ┌X-*->
tempCol : * * * | * * ┌X-*-> composite6 *
edge : * * * └X-*-> composite5 * | * *
blendWeight : * * * * ^^ └X-*-> composite5 * *
areatex : >-*-----------------*--------------*--------------*----┘| * * *
searchtex : >-*-----------------*--------------*--------------*-----┘ * * *
[Barriers] : [ | | | | | | | ]
┌ colortex0 ┐
|R |G |B |A |
└10┴10┴10┴2 ┘
| | | └X
└[unorm color]: 3x10
┌ colortex1 ┐
|R |G |B | A|
└16┴16┴16┴16┘
| | | └[smoothness ("hand" flag stored in sign)]: 1x16
└[hdr color]: 3x16
┌ colortex3 -┐
|-- R --|
└13 13 4 1 1 ┘
| | | | └X
| | | └[sss]: 1x1
| | └[emissive]: 1x4
└[light]: 2x13
┌ colortex2 ┐
|R |G |B |A |
└8 ┴8 ┴8 ┴8 ┘
| | | |
| | └[face normal]: 2x8
└[texture normal]: 2x8
┌--- lightIndex ----┐
|- data -|- color -|
└9 9 9 4 1┴ 6 5 5 ┘
| | | | | | | |
| | | | | └[color (GRB)]: 6/5/5
| | | | └[wide]: 1x1
| | | └[brightness]: 1x4
└[pos]: 3x9
Slightly outdated explanation of the Indexed Block Light system: GitHub Gist