From 0fd39d16a2467249ca979dc54e4248bcc1a4d11b Mon Sep 17 00:00:00 2001
From: Lars Hoerttrich <larshoerttrich@uni-koblenz.de>
Date: Tue, 14 Sep 2021 15:43:55 +0200
Subject: [PATCH] [#92] deleted old code and started implementation of shaders

---
 modules/rtx/src/vkcv/rtx/RTX.cpp              |  4 --
 projects/rtx/resources/shaders/raytrace.rchit | 14 +++++-
 projects/rtx/resources/shaders/raytrace.rgen  | 49 ++++++++++++++++---
 projects/rtx/resources/shaders/raytrace.rmiss | 17 +++++--
 projects/rtx/src/main.cpp                     | 35 +------------
 5 files changed, 71 insertions(+), 48 deletions(-)

diff --git a/modules/rtx/src/vkcv/rtx/RTX.cpp b/modules/rtx/src/vkcv/rtx/RTX.cpp
index ee4d79cf..4ff14726 100644
--- a/modules/rtx/src/vkcv/rtx/RTX.cpp
+++ b/modules/rtx/src/vkcv/rtx/RTX.cpp
@@ -265,10 +265,6 @@ namespace vkcv::rtx {
             m_pipelineLayout // vk::PipelineLayout layout_ = {}
         );
 
-        // WTF is this?
-//        vk::DispatchLoaderDynamic dld = vk::DispatchLoaderDynamic( (PFN_vkGetInstanceProcAddr) m_core->getContext().getInstance().getProcAddr("vkGetInstanceProcAddr") );
-//        dld.init(m_core->getContext().getInstance());
-
         m_pipeline = vk::Pipeline(m_core->getContext().getDevice().createRayTracingPipelineKHR(vk::DeferredOperationKHR(), vk::PipelineCache(), rtxPipelineInfo, nullptr, m_asManager->getDispatcher()));
         if (!m_pipeline) {
             vkcv_log(LogLevel::ERROR, "The RTX Pipeline could not be created!");
diff --git a/projects/rtx/resources/shaders/raytrace.rchit b/projects/rtx/resources/shaders/raytrace.rchit
index 26c21636..282ebff8 100644
--- a/projects/rtx/resources/shaders/raytrace.rchit
+++ b/projects/rtx/resources/shaders/raytrace.rchit
@@ -1,6 +1,18 @@
 #version 460
 #extension GL_EXT_ray_tracing : require
 
+layout(location = 0) rayPayloadInEXT Payload {
+  vec3 rayOrigin;
+  vec3 rayDirection;
+  vec3 previousNormal;
+
+  vec3 directColor;
+  vec3 indirectColor;
+  int rayDepth;
+
+  int rayActive;
+} payload;
+
 
 layout(binding = 3, set = 0) buffer rtxVertices
 {
@@ -13,5 +25,5 @@ layout(binding = 4, set = 0) buffer rtxIndices
 };
 
 void main() {
-    int b = 42;
+    payload.directColor=vec3(1,0,0);    
 }
diff --git a/projects/rtx/resources/shaders/raytrace.rgen b/projects/rtx/resources/shaders/raytrace.rgen
index 1057957f..64eb2886 100644
--- a/projects/rtx/resources/shaders/raytrace.rgen
+++ b/projects/rtx/resources/shaders/raytrace.rgen
@@ -1,9 +1,18 @@
 #version 460
 #extension GL_EXT_ray_tracing : require
 
+#define M_PI 3.1415926535897932384626433832795
 
 // A location for a ray payload (we can have multiple of these)
-//layout(location = 0) rayPayloadEXT RayPayload pay;
+layout(location = 0) rayPayloadEXT Payload {
+      vec3 rayOrigin;
+      vec3 rayDirection;
+      vec3 previousNormal;
+      vec3 directColor;
+      vec3 indirectColor;
+      int rayDepth;
+      int rayActive;
+      } payload;
 
 layout(binding = 0, set = 0, rgba16) uniform image2D outImg;           // the output image -> maybe use 16 bit values?
 layout(binding = 1, set = 0) uniform accelerationStructureEXT tlas;     // top level acceleration structure (for the noobs here (you!))
@@ -15,12 +24,40 @@ layout( push_constant ) uniform constants {
     vec4 camera_forward;    // for computing ray direction
 
     uint frameCount;        // what is this? the actual frame?
-};
+}camera;
+
+float random(vec2 uv, float seed) {
+  return fract(sin(mod(dot(uv, vec2(12.9898, 78.233)) + 1113.1 * seed, M_PI)) * 43758.5453);
+}
 
 void main(){
-    int i = 42;
+    vec2 uv = gl_LaunchIDEXT.xy + vec2(random(gl_LaunchIDEXT.xy, 0), random(gl_LaunchIDEXT.xy, 1));
+    uv /= vec2(gl_LaunchSizeEXT.xy);
+    uv = (uv * 2.0f - 1.0f) * vec2(1.0f, -1.0f);
+
+    payload.rayOrigin = camera.camera_position.xyz;
+    payload.rayDirection = normalize(uv.x * camera.camera_right + uv.y * camera.camera_up + camera.camera_forward).xyz;
+    payload.previousNormal = vec3(0.0, 0.0, 0.0);
+
+    payload.directColor = vec3(0.0, 0.0, 0.0);
+    payload.indirectColor = vec3(0.0, 0.0, 0.0);
+    payload.rayDepth = 0;
+
+    payload.rayActive = 1;
+
+    for (int x = 0; x < 16; x++) {
+    traceRayEXT(tlas, gl_RayFlagsOpaqueEXT, 0xFF, 0, 0, 0, payload.rayOrigin, 0.001, payload.rayDirection, 10000.0, 0);
+    }
+
+    vec4 color = vec4(payload.directColor + payload.indirectColor, 1.0);
+
+    if (camera.frameCount > 0) {
+    vec4 previousColor = imageLoad(outImg, ivec2(gl_LaunchIDEXT.xy));
+    previousColor *= camera.frameCount;
 
-    //vec3 color = vec3(1,0,0);
-    //ivec2 coord = ivec2(1,1);
-    //imageStore(outImg, coord, vec4(color, 1));
+    color += previousColor;
+    color /= (camera.frameCount + 1);
+    }
+    //color=vec4(1,0,0,1);//DEBUG
+    imageStore(outImg, ivec2(gl_LaunchIDEXT.xy), color);
 }
diff --git a/projects/rtx/resources/shaders/raytrace.rmiss b/projects/rtx/resources/shaders/raytrace.rmiss
index c4848df9..8304b1fb 100644
--- a/projects/rtx/resources/shaders/raytrace.rmiss
+++ b/projects/rtx/resources/shaders/raytrace.rmiss
@@ -1,9 +1,20 @@
 #version 460
 #extension GL_EXT_ray_tracing : require
 
-layout(binding = 5, set = 0) uniform accelerationStructureEXT tlas; 
+layout(location = 0) rayPayloadInEXT Payload {
+  vec3 rayOrigin;
+  vec3 rayDirection;
+  vec3 previousNormal;
 
-void main() {
-    int c = 42;
+  vec3 directColor;
+  vec3 indirectColor;
+  int rayDepth;
+
+  int rayActive;
+} payload;
 
+layout(binding = 5, set = 0) uniform accelerationStructureEXT tlas; //not neccesary in shader but for compiling ->bug
+
+void main() {
+    payload.rayActive = 0;
 }
diff --git a/projects/rtx/src/main.cpp b/projects/rtx/src/main.cpp
index 3ea43cf7..297dc36d 100644
--- a/projects/rtx/src/main.cpp
+++ b/projects/rtx/src/main.cpp
@@ -173,22 +173,7 @@ int main(int argc, const char** argv) {
 
 	vk::Pipeline rtxPipeline = rtxModule.getPipeline();
 	vk::PipelineLayout rtxPipelineLayout = rtxModule.getPipelineLayout();
-	/*
-	const vkcv::GraphicsPipelineConfig scenePipelineDefinition{
-		sceneShaderProgram,
-		UINT32_MAX,
-		UINT32_MAX,
-		scenePass,
-		{sceneLayout},
-		{ core.getDescriptorSetLayout(material0.getDescriptorSetLayout()).vulkanHandle },
-		true };
-	vkcv::GraphicsPipelineHandle scenePipeline = core.createGraphicsPipeline(scenePipelineDefinition);
-
-	if (!scenePipeline) {
-		std::cout << "Error. Could not create graphics pipeline. Exiting." << std::endl;
-		return EXIT_FAILURE;
-	}
-	*/
+
 	vkcv::ImageHandle depthBuffer = core.createImage(vk::Format::eD32Sfloat, windowWidth, windowHeight).getHandle();
 
 	const vkcv::ImageHandle swapchainInput = vkcv::ImageHandle::createSwapchainImageHandle();
@@ -241,15 +226,6 @@ int main(int argc, const char** argv) {
 
 		core.prepareImageForStorage(cmdStream, swapchainInput);
 
-		/*
-		auto recordMesh = [](const glm::mat4& MVP, const glm::mat4& M,
-							 vkcv::PushConstants &pushConstants,
-							 vkcv::DrawcallInfo& drawcallInfo) {
-			pushConstants.appendDrawcall(MVP);
-		};
-		*/
-
-
 		core.recordRayGenerationToCmdStream(
             cmdStream,
             rtxPipeline,
@@ -263,15 +239,6 @@ int main(int argc, const char** argv) {
             pushConstantsRTX,
 			windowHandle);
 
-//		scene.recordDrawcalls(cmdStream,
-//							  cameraManager.getActiveCamera(),
-//							  scenePass,
-//							  scenePipeline,    // TODO: here we need our RTX pipeline... but as a vkcv::PipelineHandle!
-//							  sizeof(glm::mat4),
-//							  recordMesh,
-//							  renderTargets,
-//							  windowHandle);
-
 		core.prepareSwapchainImageForPresent(cmdStream);
 		core.submitCommandStream(cmdStream);
 		core.endFrame(windowHandle);
-- 
GitLab