sodium-fabric icon indicating copy to clipboard operation
sodium-fabric copied to clipboard

Translucency sort using compute shaders

Open MESLewis opened this issue 3 years ago • 6 comments

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): 2021-11-17_19 22 30 After (all translucent geometry is sorted so it is drawn correctly): 2021-11-17_19 22 47

Note: Region draw order is sometimes incorrect. This is existing behavior not caused by these changes.

MESLewis avatar Nov 10 '21 17:11 MESLewis

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.

tr7zw avatar Dec 02 '21 15:12 tr7zw

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.

amnotbananaama avatar Dec 27 '21 16:12 amnotbananaama

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.

MeeniMc avatar Dec 29 '21 09:12 MeeniMc

How do I add this to my game?

GR8MonkeyPirate avatar Jan 08 '22 19:01 GR8MonkeyPirate

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?)

ExpHP avatar May 10 '22 20:05 ExpHP

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

nonetrix avatar Jun 13 '22 19:06 nonetrix

How do I use this?

alvinqwq avatar Dec 06 '22 05:12 alvinqwq

You can't at the moment, this was work in progress and has been left dormant, thus it is now incompatible with recent Sodium.

MeeniMc avatar Dec 06 '22 05:12 MeeniMc

This can be superceded by #2016 and #1687 as this will probably be no longer maintained

hexadecimal233 avatar Aug 16 '23 05:08 hexadecimal233