Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
939614f
rtx: Decouple BLAS/volume/light invalidation timestamps
tarcila Apr 30, 2026
5168cd6
rtx: Fix null-deref in face-varying triangle validation
tarcila Apr 29, 2026
6955236
rtx: Own generated tangent buffer
tarcila Apr 29, 2026
e7bcdab
rtx: Negate generated bitangent
tarcila Apr 29, 2026
2ff810f
rtx: Harden tangent generation against degenerate inputs
tarcila Apr 29, 2026
e9c2b2b
rtx: Compute per-vertex tangents via angle-weighted accumulation
tarcila May 6, 2026
8d2595d
rtx: Read full vec4 tangent and interpolate handedness
tarcila Apr 29, 2026
a7d0988
rtx: NaN-safe shading and per-vertex bitangent blending
tarcila May 6, 2026
cc40202
rtx: Gate Quality renderer direct light on Ns instead of Ng
tarcila May 6, 2026
f3d7c06
rtx: Fix biased uniform-sphere and cosine-hemisphere samplers
tarcila Apr 29, 2026
c3e34ba
rtx: Add diffuse lobe to PBR nextRay path
tarcila Apr 29, 2026
4f6ae3d
rtx: Fuse prepareDenoiseInput and prepareDenoiseGuides
tarcila Apr 30, 2026
17efc09
rtx: Drop redundant dir/t term from epsilonFrom
tarcila Apr 30, 2026
8728a4b
rtx: Lift shadow-ray origins onto smooth surface (Hanika fix)
tarcila May 6, 2026
18d2346
rtx: Don't mix transmission into Interactive's surface alpha
tarcila May 12, 2026
b2f3733
rtx: Use NdotV Fresnel for PBR diffuse weight
tarcila May 12, 2026
a2df239
rtx: Fold normal-degeneracy fallback into sampleNormalMap
tarcila May 12, 2026
65d3574
rtx: Rename PBR shading state's ior field to eta
tarcila May 12, 2026
e18c2a4
rtx: Use the `color` light parameter when sampling an HDRI
tarcila May 12, 2026
f436ca8
rtx: Sample the PBR clearcoat lobe in nextRay
tarcila May 12, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
79 changes: 24 additions & 55 deletions devices/rtx/device/frame/Frame.cu
Original file line number Diff line number Diff line change
Expand Up @@ -73,8 +73,12 @@ __device__ bool resolveSample(uint32_t idx,
return divisor > 0;
}

__global__ void prepareDenoiseInput(const vec4 *__restrict__ accumColor,
__global__ void prepareDenoiseInputs(const vec4 *__restrict__ accumColor,
const vec3 *__restrict__ accumAlbedo,
const vec3 *__restrict__ accumNormal,
vec4 *__restrict__ denoiseInput,
vec3 *__restrict__ denoiseAlbedo,
vec3 *__restrict__ denoiseNormal,
uvec2 size,
int frameID,
int checkerboardID,
Expand All @@ -88,45 +92,6 @@ __global__ void prepareDenoiseInput(const vec4 *__restrict__ accumColor,
int divisor;
if (!resolveSample(idx, size, frameID, checkerboardID, srcIdx, divisor)) {
denoiseInput[idx] = vec4(0.f);
return;
}

vec4 c = accumColor[srcIdx] / float(divisor);
if (fireflyFilter)
c = detail::inverseTonemap(c);
denoiseInput[idx] = c;
}

void launchPrepareDenoiseInput(const vec4 *accumColor,
vec4 *denoiseInput,
uvec2 size,
int frameID,
int checkerboardID,
bool fireflyFilter,
cudaStream_t stream)
{
const uint32_t nPixels = size.x * size.y;
const uint32_t blockSize = 256;
const uint32_t gridSize = (nPixels + blockSize - 1) / blockSize;
prepareDenoiseInput<<<gridSize, blockSize, 0, stream>>>(
accumColor, denoiseInput, size, frameID, checkerboardID, fireflyFilter);
}

__global__ void prepareDenoiseGuides(const vec3 *__restrict__ accumAlbedo,
const vec3 *__restrict__ accumNormal,
vec3 *__restrict__ denoiseAlbedo,
vec3 *__restrict__ denoiseNormal,
uvec2 size,
int frameID,
int checkerboardID)
{
const uint32_t idx = blockIdx.x * blockDim.x + threadIdx.x;
if (idx >= size.x * size.y)
return;

uint32_t srcIdx;
int divisor;
if (!resolveSample(idx, size, frameID, checkerboardID, srcIdx, divisor)) {
if (denoiseAlbedo)
denoiseAlbedo[idx] = vec3(0.f);
if (denoiseNormal)
Expand All @@ -135,6 +100,11 @@ __global__ void prepareDenoiseGuides(const vec3 *__restrict__ accumAlbedo,
}

const float invDivisor = 1.0f / float(divisor);
vec4 c = accumColor[srcIdx] * invDivisor;
if (fireflyFilter)
c = detail::inverseTonemap(c);
denoiseInput[idx] = c;

if (denoiseAlbedo)
denoiseAlbedo[idx] = accumAlbedo[srcIdx] * invDivisor;

Expand All @@ -146,25 +116,31 @@ __global__ void prepareDenoiseGuides(const vec3 *__restrict__ accumAlbedo,
}
}

void launchPrepareDenoiseGuides(const vec3 *accumAlbedo,
void launchPrepareDenoiseInputs(const vec4 *accumColor,
const vec3 *accumAlbedo,
const vec3 *accumNormal,
vec4 *denoiseInput,
vec3 *denoiseAlbedo,
vec3 *denoiseNormal,
uvec2 size,
int frameID,
int checkerboardID,
bool fireflyFilter,
cudaStream_t stream)
{
const uint32_t nPixels = size.x * size.y;
const uint32_t blockSize = 256;
const uint32_t gridSize = (nPixels + blockSize - 1) / blockSize;
prepareDenoiseGuides<<<gridSize, blockSize, 0, stream>>>(accumAlbedo,
prepareDenoiseInputs<<<gridSize, blockSize, 0, stream>>>(accumColor,
accumAlbedo,
accumNormal,
denoiseInput,
denoiseAlbedo,
denoiseNormal,
size,
frameID,
checkerboardID);
checkerboardID,
fireflyFilter);
}

__global__ void compositeBackground(vec4 *__restrict__ accumColor,
Expand Down Expand Up @@ -561,25 +537,18 @@ void Frame::renderFrame()
const bool useFloatOutput = m_denoise || m_colorType == ANARI_FLOAT32_VEC4;

if (m_denoise) {
launchPrepareDenoiseInput(m_accumColor.ptrAs<vec4>(),
launchPrepareDenoiseInputs(m_accumColor.ptrAs<vec4>(),
m_accumAlbedo.ptrAs<vec3>(),
m_accumNormal.ptrAs<vec3>(),
m_denoiseInput.ptrAs<vec4>(),
m_denoiseAlbedo.ptrAs<vec3>(),
m_denoiseNormal.ptrAs<vec3>(),
hd.fb.size,
hd.fb.frameID,
hd.fb.checkerboardID,
hd.renderer.fireflyFilter,
state.stream);

if (m_denoiseUsingAlbedo || m_denoiseUsingNormal) {
launchPrepareDenoiseGuides(m_accumAlbedo.ptrAs<vec3>(),
m_accumNormal.ptrAs<vec3>(),
m_denoiseAlbedo.ptrAs<vec3>(),
m_denoiseNormal.ptrAs<vec3>(),
hd.fb.size,
hd.fb.frameID,
hd.fb.checkerboardID,
state.stream);
}

m_denoiser.launch();

launchCompositeBackground(m_accumColor.ptrAs<vec4>(),
Expand Down
Loading
Loading