sodium-fabric
sodium-fabric copied to clipboard
Translucency sort using compute shaders
Fixes #38 for supported hardware
Adds support for sorting translucent geometry by using OpenGL compute shaders.
Either OpenGL 4.3+ or OpenGL 4.2+ with both ARB_shader_storage_buffer_object
and ARB_compute_shader
is required for this option to function.
Before (note that some parts of slime blocks and stained glass are not drawn):
After (all translucent geometry is sorted so it is drawn correctly):
Note: Region draw order is sometimes incorrect. This is existing behavior not caused by these changes.
Gave it a quick try: it's able to be just merged into the 1.18 branch without changes/conflicts, and from some quick testing, it seems to be fully working as well. 👍 Edit: Noteworthy: has some issue with the current release of iris.
Copying Jelly's comments on this PR from discord for accessibility:
Thinking about it for some time, I've created more or less the following work list for getting this work into upstream:
- Change the renderer to only care about quads, not triangles, so that you can simplify your sorting code & fix a few edge cases that vanilla handles correctly (important)
- At some point we thought mods might care about triangle meshes but I don't see any reason to support this.
- This also allows for some important optimizations that might happen in the future.
- We have to deal quads anyways for FREX/FRAPI. So this needs to change.
- Import the changes to ThinGL from 0.4-experiments so we can provide a cleaner API interface for compute shaders (refactor)
- Move the compute code out of the chunk renderer and into new classes for occlusion culling/render list building (refactor)
- Investigate a CPU-side fallback for the compute shader (very low priority)
Otherwise for the code itself, you've done a great job here and I don't have any complaints with that much. We just need to provide better facilities in Sodium for handling this.
Currently requires the following patch to compile when rebased on 1.18.x/dev
diff --git a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java
index cb9b975..7383043 100644
--- a/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java
+++ b/src/main/java/me/jellysquid/mods/sodium/client/render/chunk/RegionChunkRenderer.java
@@ -114,8 +114,7 @@ public class RegionChunkRenderer extends ShaderChunkRenderer {
float y = getCameraTranslation(region.getOriginY(), camera.blockY, camera.deltaY);
float z = getCameraTranslation(region.getOriginZ(), camera.blockZ, camera.deltaZ);
- Matrix4f matrix = this.cachedModelViewMatrix;
- matrix.set(matrices.modelView());
+ Matrix4f matrix = new Matrix4f(matrices.modelView());
matrix.translate(x, y, z);
compute.setModelViewMatrix(matrix);
Note that this may cause some allocation overhead.
Edit: do not use as-is, this patch trashes performance horribly, a solution must be found to remove the extra allocation instead.
How do I add this to my game?
Hi, has any progress been made/is there anywhere to track progress on the task list linked by amnotbananaama? (or any other related efforts to help merge this into upstream?)
How do I add this to my game?
Might be able to clone https://github.com/MESLewis/sodium-fabric/tree/translucency-sort and follow the build steps just be very aware it is most likely very unstable
How do I use this?
You can't at the moment, this was work in progress and has been left dormant, thus it is now incompatible with recent Sodium.
This can be superceded by #2016 and #1687 as this will probably be no longer maintained