From 1e855a0ed045a262b27e76babad424dfa80e6525 Mon Sep 17 00:00:00 2001 From: mcrcortex <{ID}+{username}@users.noreply.github.com> Date: Thu, 11 Jul 2024 16:50:32 +1000 Subject: [PATCH] Shader compiles --- .../Gl46MeshletsFarWorldRenderer.java | 1 + .../lod/hierarchial/binding_points.glsl | 10 ++++++ .../voxy/shaders/lod/hierarchial/node.glsl | 10 ++++-- .../shaders/lod/hierarchial/screenspace.glsl | 30 ++++++++++-------- .../shaders/lod/hierarchial/transform.glsl | 11 +++++++ .../{traversal.glsl => traversal.comp} | 31 +++++++++++-------- 6 files changed, 64 insertions(+), 29 deletions(-) create mode 100644 src/main/resources/assets/voxy/shaders/lod/hierarchial/binding_points.glsl rename src/main/resources/assets/voxy/shaders/lod/hierarchial/{traversal.glsl => traversal.comp} (88%) diff --git a/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java b/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java index 03efe9dc..d491a2d4 100644 --- a/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java +++ b/src/main/java/me/cortex/voxy/client/core/rendering/Gl46MeshletsFarWorldRenderer.java @@ -44,6 +44,7 @@ import static org.lwjgl.opengl.NVRepresentativeFragmentTest.GL_REPRESENTATIVE_FR // the shader can cull the verticies of any quad that has its index over the expected quuad count // this could potentially result in a fair bit of memory savings (especially if used in normal mc terrain rendering) public class Gl46MeshletsFarWorldRenderer extends AbstractFarWorldRenderer { + private final Shader lodShader = Shader.make() .define("QUADS_PER_MESHLET", RenderDataFactory.QUADS_PER_MESHLET) .add(ShaderType.VERTEX, "voxy:lod/gl46mesh/quads.vert") diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchial/binding_points.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchial/binding_points.glsl new file mode 100644 index 00000000..1f8f5377 --- /dev/null +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchial/binding_points.glsl @@ -0,0 +1,10 @@ +#define SCENE_UNIFORM_INDEX 0 +#define NODE_DATA_INDEX 1 +#define ATOMIC_DATA_INDEX 2 +#define REQUEST_QUEUE_INDEX 3 +#define RENDER_QUEUE_INDEX 4 +#define TRANSFORM_ARRAY_INDEX 5 + +//Samplers +#define HIZ_BINDING_INDEX 0 + diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchial/node.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchial/node.glsl index 970731df..f17e2fb1 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchial/node.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchial/node.glsl @@ -3,7 +3,7 @@ layout(binding = NODE_DATA_INDEX, std430) restrict buffer NodeData { //Needs to be read and writeable for marking data, //(could do an evil violation, make this readonly, then have a writeonly varient, which means that writing might not be visible but will show up by the next frame) //Nodes are 16 bytes big (or 32 cant decide, 16 might _just_ be enough) - ivec4[] nodes; + uvec4[] nodes; }; //First 2 are joined to be the position @@ -73,8 +73,12 @@ uint getId(in UnpackedNode node) { return node.nodeId; } -uint getChild(in UnpackedNode node) { - return node.flags >> 2; +uint getChildCount(in UnpackedNode node) { + return ((node.flags >> 2)&7U)+1; +} + +uint getTransformIndex(in UnpackedNode node) { + return (node.flags >> 5)&31u; } //----------------------------------- diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchial/screenspace.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchial/screenspace.glsl index ff449c21..f81b2198 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchial/screenspace.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchial/screenspace.glsl @@ -21,31 +21,35 @@ vec3 minBB; vec3 maxBB; vec2 size; -vec3 projPoint(mat4 mat, vec3 pos) { - vec4 t = mat * vec4(vec3(pos),1); - return t.xyz/t.w; -} //Sets up screenspace with the given node id, returns true on success false on failure/should not continue //Accesses data that is setup in the main traversal and is just shared to here void setupScreenspace(in UnpackedNode node) { //TODO: Need to do aabb size for the nodes, it must be an overesimate of all the children - mat4 mvp; + Transform transform = transforms[getTransformIndex(node)]; - vec3 basePos; - vec3 minSize; - vec3 maxSize; + /* + vec3 point = VP*(((transform.transform*vec4((node.pos< 0.0001; diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchial/transform.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchial/transform.glsl index 128a1f58..c6b71e57 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchial/transform.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchial/transform.glsl @@ -1,3 +1,14 @@ //This provides per scene/viewport/transfrom access, that is, a node can be attached to a specific scene/viewport/transfrom, this is so that // different nodes/models can have different viewports/scenes/transfrom which enables some very cool things like // absolutly massive VS2 structures should... just work :tm: - todd howard + +struct Transform { + mat4 transform; + ivec4 originPos; + ivec4 worldPos; +}; + + +layout(binding = TRANSFORM_ARRAY_INDEX, std140) uniform TransformArray { + Transform transforms[32]; +}; diff --git a/src/main/resources/assets/voxy/shaders/lod/hierarchial/traversal.glsl b/src/main/resources/assets/voxy/shaders/lod/hierarchial/traversal.comp similarity index 88% rename from src/main/resources/assets/voxy/shaders/lod/hierarchial/traversal.glsl rename to src/main/resources/assets/voxy/shaders/lod/hierarchial/traversal.comp index e137dc19..ba18ddfe 100644 --- a/src/main/resources/assets/voxy/shaders/lod/hierarchial/traversal.glsl +++ b/src/main/resources/assets/voxy/shaders/lod/hierarchial/traversal.comp @@ -1,7 +1,11 @@ #version 460 core + //TODO: make this better than a single thread layout(local_size_x=1, local_size_y=1) in; +#import +#line 7 + //The queue contains 3 atomics // end (the current processing pointer) // head (the current point that is ok to read from) @@ -11,13 +15,15 @@ layout(local_size_x=1, local_size_y=1) in; // write the data getting enqueued at the starting point specified by the `top` incrmenet // then increment head strictly _AFTER_ writing to the queue, this ensures that the data is always written and avaible in the queue -layout(binding = 0, std140) uniform SceneUniform { - uint a; +layout(binding = SCENE_UNIFORM_INDEX, std140) uniform SceneUniform { + mat4 VP; + ivec3 camSecPos; + uint screenW; + vec3 camSubSecPos; + uint screenH; }; -#define NODE_DATA_INDEX 1 - -layout(binding = 2, std430) restrict buffer Atomics { +layout(binding = ATOMIC_DATA_INDEX, std430) restrict buffer Atomics { uint requestQueueIndex; uint requestQueueMaxSize; @@ -25,11 +31,11 @@ layout(binding = 2, std430) restrict buffer Atomics { uint renderQueueMaxSize; } atomics; -layout(binding = 3, std430) restrict writeonly buffer RequestQueue { +layout(binding = REQUEST_QUEUE_INDEX, std430) restrict writeonly buffer RequestQueue { uint[] requestQueue; }; -layout(binding = 4, std430) restrict writeonly buffer RenderQueue { +layout(binding = RENDER_QUEUE_INDEX, std430) restrict writeonly buffer RenderQueue { uint[] renderQueue; }; @@ -41,16 +47,15 @@ layout(binding = 2, std430) restrict buffer QueueData { uint[] queue; } queue; */ - +#line 1 #import - +#line 1 #import - -#define HIZ_BINDING_INDEX 0 +#line 1 //Contains all the screenspace computation #import - +#line 58 //If a request is successfully added to the RequestQueue, must update NodeData to mark that the node has been put into the request queue // to prevent it from being requested every frame and blocking the queue @@ -72,7 +77,7 @@ layout(binding = 2, std430) restrict buffer QueueData { void addRequest(inout UnpackedNode node) { if (!hasRequested(node)) { //TODO: maybe try using only 1 variable and it being <0 being bad - if (atomics.requestQueueIndex < atomic.requestQueueMaxSize) { + if (atomics.requestQueueIndex < atomics.requestQueueMaxSize) { //Mark node as having a request submitted to prevent duplicate submissions requestQueue[atomicAdd(atomics.requestQueueIndex, 1)] = getId(node); markRequested(node);