Skip to content

Shadow denoiser feedback #1

@turanszkij

Description

@turanszkij

Hello,

Thank you for this amazing library, it looks and performs wonderfully. The integration was fairly straight forward for this amount of complexity. I just had a few minor clarifications I'd like to write down for anyone wanting to integrate it into their own progam in the future.

  • Velocity buffer is expected to be computed by the application (per pixel) as: clipspacePos.xy/clipspacePos.w - clipspacePosPrev.xy/clipspacePosPrev.w (the denoiser library converts velocity from clip space to uv space internally as velocity * float2(0.5, -0.5) ).
  • You can #define INVERTED_DEPTH_RANGE if using a reverse depth buffer, this matters when choosing closest velocity in neighborhood (reverse depth buffer means near=1, far=0)
  • matrices you provide are multiplied in the shader as mul(matrix, vector) so the library assumes hlsl default column_major matrix layout
  • Worth to clarify texture formats: "moments" textures should use FORMAT_R11G11B10_FLOAT, the "reprojection results" textures should use FORMAT_R16G16_FLOAT
  • Metadata buffer size? Worth to clarify if this is for the 8x4 tiles or the 8x8 tiles. (As it's suggested that the classification and filter passes could use different tile size).
  • Denoising multiple lights: I chose to use the Z Dispatch dimension to choose which light to denoise in the denoiser passes. For that I currently had to declare a groupshared uint light_index; which I assign with light_index = Gid.z (SV_GroupIndex Z component). The light_index is used to simply index resource bindings for separate light denoiser textures. This is because the library only uses XY dimensions of all thread IDs in the user functions. It would be cool if the denoiser had a notion of light index in the user functions (or just provide XYZ components of thread IDs)

Also, there are a lot of user defined functions. It would have been much easier if the library would expose a stub of all these functions instead of having to go through the library code and look for undefined functions (or look at compiler errors).

I don't mean to complain though, it is amazing that this library is provided as open source. The existing documentation was also very helpful.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions