diff --git a/modules/rtx/src/vkcv/rtx/RTX.cpp b/modules/rtx/src/vkcv/rtx/RTX.cpp index ee4d79cfd2cfe4bd5e3c06e851704d1e64ac2423..4ff1472679f2cd4df1cf74bb91a0c490ad1b54b1 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 26c21636a11051fcf8e5030e5d223e736daf6eae..282ebff82803aa94cd27fdee79271c16fc2f2e03 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 1057957f8ae3893afb39ac2c518ca8a93731551d..64eb2886100764db646227850bd4df2b12b41485 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 c4848df9e119c6c399649e9c9519600d327ebf23..8304b1fbbcc63b99adb0438d43bf47e975ae4496 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 3ea43cf7d4728f7bb4aef4dbcbe820e005aa381c..297dc36d3d480e3b13093cf9b2eb09e019eb16f8 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);