From 55937807aeca2b32185241d098d4b494d7e0f366 Mon Sep 17 00:00:00 2001
From: Alexander Gauggel <agauggel@uni-koblenz.de>
Date: Tue, 13 Jul 2021 11:47:49 +0200
Subject: [PATCH] [#87] Add task index visualisation

---
 .../mesh_shader/resources/shaders/shader.frag | 25 ++++++++++++++++++-
 .../mesh_shader/resources/shaders/shader.mesh |  3 +++
 2 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/projects/mesh_shader/resources/shaders/shader.frag b/projects/mesh_shader/resources/shaders/shader.frag
index c3740e2c..f4f6982f 100644
--- a/projects/mesh_shader/resources/shaders/shader.frag
+++ b/projects/mesh_shader/resources/shaders/shader.frag
@@ -2,8 +2,31 @@
 #extension GL_ARB_separate_shader_objects : enable
 
 layout(location = 0) in  vec3 passNormal;
+layout(location = 1) in  flat uint passTaskIndex;
 layout(location = 0) out vec3 outColor;
 
+uint lowbias32(uint x)
+{
+    x ^= x >> 16;
+    x *= 0x7feb352dU;
+    x ^= x >> 15;
+    x *= 0x846ca68bU;
+    x ^= x >> 16;
+    return x;
+}
+
+float hashToFloat(uint hash){
+    return (hash % 255) / 255.f;
+}
+
+vec3 colorFromIndex(uint i){
+    return vec3(
+        hashToFloat(lowbias32(i+0)),
+        hashToFloat(lowbias32(i+1)),
+        hashToFloat(lowbias32(i+2)));
+}
+
 void main() {
-	outColor = normalize(passNormal) * 0.5 +0.5;
+	outColor = normalize(passNormal) * 0.5 + 0.5;
+    outColor = colorFromIndex(passTaskIndex);
 }
\ No newline at end of file
diff --git a/projects/mesh_shader/resources/shaders/shader.mesh b/projects/mesh_shader/resources/shaders/shader.mesh
index a120e432..848fca2c 100644
--- a/projects/mesh_shader/resources/shaders/shader.mesh
+++ b/projects/mesh_shader/resources/shaders/shader.mesh
@@ -12,6 +12,7 @@ layout( push_constant ) uniform constants{
 };
 
 layout(location = 0) out vec3 passNormal[];
+layout(location = 1) out uint passTaskIndex[];
 
 struct Vertex
 {
@@ -45,8 +46,10 @@ void main()	{
     
     vec3 inPos      = vertices[index].position;
     vec3 inNormal   = vertices[index].normal;
+    
     gl_MeshVerticesNV[workIndex].gl_Position    = mvp * vec4(inPos, 1);
     passNormal[workIndex]                       = inNormal;
+    passTaskIndex[workIndex]                    = previousMeshGroupCount;
     
     if(gl_LocalInvocationID.x == 0){
         gl_PrimitiveCountNV = 10;
-- 
GitLab