...
Code Block |
---|
// numLightSamples is the number of light samples generated for *each* shading point. // Currently, this value is used for all points in the current shading context. // RixLightingServices::GenerateLightSamples() fillfills array parameters with the first // sample for all shading points first, then the second sample, and so on... // m_ClDiffuse, m_ClSpecular, m_ClUser are arrays of RtColorRGB buffers. Each buffer is of size // numLightSamples * numPoints. They will store the generated light samples. RixBXLobeWeights lightContributions( numLightSamples * numPoints, m_numPotentialDiffuseLobes, m_numPotentialSpecularLobes, m_numPotentialUserLobes, m_ClDiffuse, m_ClSpecular, m_ClUser); // m_diffuse, m_specular, m_user are arrays of RtColorRGB buffers. Each buffer is of size // numLightSamples * numPoints. They will store the bxdf contribution for each light sample. RixBXLobeWeights evaluatedMaterialContributions( numLightSamples * numPoints, m_numPotentialDiffuseLobes, m_numPotentialSpecularLobes, m_numPotentialUserLobes, m_diffuse, m_specular, m_user); // For additional description of the call parameters, see RixLightingServices API. lightingSvc->GenerateSamples( numLightSamples, &rixRNG, lightGroupIds, lightLpeTokens, directions, lightNormals, distance, &lightContributions, transmission, nullptr, lightPdf, lobesWanted, &evaluatedMaterialContributions, evaluatedMaterialFPdf, evaluatedMaterialRPdf, lobesEvaluated, nullptr, throughput); // We don't need to make an explicit call to the bxdf's EvaluateSamples(), because the lighting // services have done it for us, since we provided them with 'evaluatedMaterialContributions'. |
...
Code Block |
---|
// numBxdfSamples is the number of bxdf samples generated for *each* shading point. // Currently, this value is used for all points in the current shading context. RixBXLobeWeights bxdfContributions( numBxdfSamples* numPoints, m_numPotentialDiffuseLobes, m_numPotentialSpecularLobes, m_numPotentialUserLobes, m_diffuse, m_specular, m_user); // The RixBxdf GenerateSample API is single-sample (per shading point), so when dealing with // multiple bxdf samples, we need to wrap it inside a loop. for (int bs = 0; bs < numBxdfSamples; bs++) { int offset = bs * numPoints; // Changing the offset of the lobe weights will write into the lobe weights at the appropriate // offset for this set of bxdf samples. bxdfContribution.SetOffset(offset); bxdf.GenerateSample(k_RixBXDirectLighting, lobesWanted, &rixRNG, lobeSampled + offset, directions + offset, bxdfContributions, materialFPdf + offset, materialRPdf + offset, nullptr); for (int i = 0; i < numPoints; i++) distances[offset + i] = 1e20f; incRNG(shadingContext); } // Reset the offset of the lobe weights back to zero for the code below. bxdfContributions.SetOffset(0); RixBXLobeWeights lightContributions( numBxdfSamples * numPoints, m_numPotentialDiffuseLobes, m_numPotentialSpecularLobes, m_numPotentialUserLobes, m_ClDiffuse, m_ClSpecular, m_ClUser); lightingSvc->EvaluateSamples( // inputs numBxdfSamples, &rixRNG, directions, distances, materialFPdf, &bxdfContributions, lobeSampled, // outputs lightGroupIds, lightLpeTokens, &lightContributions, transmission, nullptr, lightPdf, nullptr, nullptr, throughput); |
...
Code Block |
---|
RixIntegrator::Integrate(numSCtxs, sCtxs) ComputeLightTransport(numSCtxs, sCtxs) Splat results to display services ComputeLightTransport(numSCtxs, sCtxs) For each shading context sCtx: ComputeDirectLighting(sCtx) ComputeIndirectLighting(sCtx) ComputeDirectLighting(sCtx) InitializeLightingServices() GenerateLightSamples() EvaluateBxdfSamples() Compute MIS weights GenerateBxdfSamples() EvaluateLightSamples() Compute MIS weights ComputeIndirectLighting(sCtx) iRays = CreateIndirectRays(sCtx) (numSCtxs, sCtxs) = TraceIndirectRays(iRays) ComputeLightTransport(numSCtxs, sCtxs) |
...