Guest User

Untitled

a guest
May 10th, 2026
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.91 KB | None | 0 0
  1. ffxCreateContextDescUpscale create_ffx_upscale_context{};
  2. create_ffx_upscale_context.header.type = FFX_API_CREATE_CONTEXT_DESC_TYPE_UPSCALE;
  3. create_ffx_upscale_context.header.pNext = &backend_vk_desc.header;
  4. create_ffx_upscale_context.maxUpscaleSize = {WINDOW_SIZE.x, WINDOW_SIZE.y};
  5. create_ffx_upscale_context.maxRenderSize = {WINDOW_SIZE.x, WINDOW_SIZE.y};
  6. create_ffx_upscale_context.flags |= FFX_UPSCALE_ENABLE_AUTO_EXPOSURE;
  7. create_ffx_upscale_context.flags |= FFX_UPSCALE_ENABLE_HIGH_DYNAMIC_RANGE;
  8. create_ffx_upscale_context.flags |= FFX_UPSCALE_ENABLE_MOTION_VECTORS_JITTER_CANCELLATION;
  9. create_ffx_upscale_context.flags |= FFX_UPSCALE_ENABLE_NON_LINEAR_COLORSPACE;
  10. create_ffx_upscale_context.flags |= FFX_UPSCALE_ENABLE_DEPTH_INFINITE;
  11. create_ffx_upscale_context.flags |= FFX_UPSCALE_ENABLE_DEPTH_INVERTED;
  12. create_ffx_upscale_context.fpMessage = nullptr;
  13.  
  14.  
  15. auto prev = std::chrono::high_resolution_clock::now();
  16. while (!quit) {
  17.         // delta t
  18.         auto now = std::chrono::high_resolution_clock::now();
  19.         float delta_t_ms = std::chrono::duration<float, std::milli>(now - prev).count();
  20.         prev = now;
  21.  
  22.         // jitter
  23.         float aspect = float(RENDER_SIZE.x) / float(RENDER_SIZE.y);
  24.         glm::vec2 jitter;
  25.         const int32_t jitter_phase_count = ffxFsr3GetJitterPhaseCount(RENDER_SIZE.x, WINDOW_SIZE.x);
  26.         ffxFsr3GetJitterOffset(&jitter.x, &jitter.y, frame_number % jitter_phase_count, jitter_phase_count);
  27.         glm::vec2 jitterNDC{2.0f * jitter.x / (float)RENDER_SIZE.x, 2.0f * jitter.y / (float)RENDER_SIZE.y};
  28.         camera.updateMatrices(aspect, jitterNDC);
  29.  
  30.         // camera.updateMatrices
  31.         float m_fov = 39.0f;
  32.         float m_near = 0.1f;
  33.         float m_far  = 1000.0f;
  34.  
  35.         glm::mat4 Camera::projMatrix(float aspect, glm::vec2 jitterNDC) const {
  36.                 glm::mat4 proj = glm::perspective(glm::radians(m_fov), aspect, m_near, m_far);
  37.  
  38.                 glm::mat4 trans = glm::translate(glm::mat4(1.0), glm::vec3(jitterNDC.x, jitterNDC.y, 0));
  39.  
  40.                 return trans * proj;
  41.         }
  42.  
  43.         void Camera::updateMatrices(float aspect, glm::vec2 jitterNDC) {
  44.                 glm::mat4 view = glm::lookAt(m_pos, m_pos + m_dir, glm::vec3(0, 1, 0));
  45.                 glm::mat4 proj = glm::perspective(glm::radians(m_fov), aspect, m_near, m_far);
  46.                 glm::mat4 trans = glm::translate(glm::mat4(1.0), glm::vec3(jitterNDC.x, jitterNDC.y, 0));
  47.  
  48.                 glm::mat4 viewProjJittered = trans * proj * view;
  49.  
  50.                 prev_inv_view_proj_jittered = inv_view_proj_jittered;
  51.                 inv_view_proj_jittered = glm::inverse(viewProjJittered);
  52.         }
  53.  
  54.  
  55.         // FSR
  56.         ffxDispatchDescUpscale ffx_upscale_dispatch_context{};
  57.         ffx_upscale_dispatch_context.header.type = FFX_API_DISPATCH_DESC_TYPE_UPSCALE;
  58.         ffx_upscale_dispatch_context.header.pNext = nullptr;
  59.         ffx_upscale_dispatch_context.commandList = cmd;
  60.         ffx_upscale_dispatch_context.color = ffxApiGetResourceVK(draw_image.image, ffxApiGetImageResourceDescriptionVK(draw_image.image, draw_image.create_info, 0), FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
  61.         ffx_upscale_dispatch_context.depth = ffxApiGetResourceVK(depth_image.image, ffxApiGetImageResourceDescriptionVK(depth_image.image, depth_image.create_info, 0), FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
  62.         ffx_upscale_dispatch_context.motionVectors = ffxApiGetResourceVK(motion_image.image, ffxApiGetImageResourceDescriptionVK(motion_image.image, motion_image.create_info, 0), FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
  63.         ffx_upscale_dispatch_context.exposure = ffxApiGetResourceVK(nullptr, {}, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
  64.         ffx_upscale_dispatch_context.reactive = ffxApiGetResourceVK(nullptr, {}, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
  65.         ffx_upscale_dispatch_context.transparencyAndComposition = ffxApiGetResourceVK(nullptr, {}, FFX_API_RESOURCE_STATE_PIXEL_COMPUTE_READ);
  66.         ffx_upscale_dispatch_context.output = ffxApiGetResourceVK(output_image.image, ffxApiGetImageResourceDescriptionVK(output_image.image, output_image.create_info, 0), FFX_API_RESOURCE_STATE_UNORDERED_ACCESS);
  67.         ffx_upscale_dispatch_context.jitterOffset.x = jitter.x;
  68.         ffx_upscale_dispatch_context.jitterOffset.y = jitter.y;
  69.         ffx_upscale_dispatch_context.motionVectorScale.x = float(RENDER_SIZE.x);
  70.         ffx_upscale_dispatch_context.motionVectorScale.y = float(RENDER_SIZE.y);
  71.         ffx_upscale_dispatch_context.reset = false;
  72.         ffx_upscale_dispatch_context.enableSharpening = false;
  73.         ffx_upscale_dispatch_context.sharpness = 0.8;
  74.         ffx_upscale_dispatch_context.frameTimeDelta = delta_t_ms; // FSR expects milliseconds
  75.         // ffx_upscale_dispatch_context.preExposure = 0.5f;
  76.         ffx_upscale_dispatch_context.renderSize.width = float(RENDER_SIZE.x);
  77.         ffx_upscale_dispatch_context.renderSize.height = float(RENDER_SIZE.y);
  78.         ffx_upscale_dispatch_context.upscaleSize.width = float(WINDOW_SIZE.x);
  79.         ffx_upscale_dispatch_context.upscaleSize.height = float(WINDOW_SIZE.y);
  80.         ffx_upscale_dispatch_context.cameraFovAngleVertical = glm::radians(camera.fov());
  81.         ffx_upscale_dispatch_context.cameraFar = std::numeric_limits<float>::infinity();
  82.         ffx_upscale_dispatch_context.cameraNear = camera.near();
  83. }
  84.  
  85.  
  86. // compute shader
  87. void main() {
  88.         vec2 texel_coord = vec2(gl_GlobalInvocationID.xy);
  89.  
  90.         // NDC space [-1, 1]
  91.         vec2 ndc = (texel_coord / vec2(imageSize(color_image))) * 2.0 - 1.0;
  92.  
  93.         // Homogeneous clip space points
  94.         vec4 near_point = ubo.inv_view_proj_jittered * vec4(ndc, 0.0, 1.0);
  95.         vec4 far_point  = ubo.inv_view_proj_jittered * vec4(ndc, 1.0, 1.0);
  96.  
  97.         // Perspective divide
  98.         near_point.xyz /= near_point.w;
  99.         far_point.xyz  /= far_point.w;
  100.  
  101.         vec3 ray_pos = near_point.xyz;
  102.         vec3 ray_dir = normalize(far_point.xyz - near_point.xyz);
  103.  
  104.         Hit hit = traceWorld(ray_pos, ray_dir);
  105.         vec3 world_pos = ray_pos + ray_dir * hit.depth;
  106.  
  107.         imageStore(color_image, ivec2(texel_coord), hit.color);
  108.  
  109.         mat4 prev_view_proj_jittered = inverse(ubo.prev_inv_view_proj_jittered);
  110.         mat4 curr_view_proj_jittered = inverse(ubo.inv_view_proj_jittered);
  111.  
  112.         // inverse depth
  113.         float depth = 0.1 / hit.depth;
  114.  
  115.         imageStore(depth_image, ivec2(texel_coord), vec4(depth, 0.0, 0.0, 0.0));
  116.  
  117.         vec2 motion = vec2(0.0);
  118.         if (hit.color.a > 0.0) {
  119.                 vec4 curr_clip = curr_view_proj_jittered * vec4(world_pos, 1.0);
  120.                 vec4 prev_clip = prev_view_proj_jittered * vec4(world_pos, 1.0);
  121.  
  122.                 vec2 curr_ndc = curr_clip.xy / curr_clip.w;
  123.                 vec2 prev_ndc = prev_clip.xy / prev_clip.w;
  124.  
  125.                 motion = (prev_ndc - curr_ndc) / 2.f;
  126.         }
  127.  
  128.         imageStore(motion_vector_image, ivec2(texel_coord), vec4(motion, 0.0, 0.0));
  129.  
  130. }
Advertisement
Add Comment
Please, Sign In to add comment