Пример #1
0
def UniformSampleOneLight(scene: Scene, renderer: Renderer, p: Point3d, n: Normal, wo: Vector3d,
                          time: float, bsdf: BSDF, sample: Sample,
                          lightSampleOffsets: [LightSampleOffsets]=None, bsdfSampleOffsets: [BSDFSampleOffsets]=None,
                          lightNumOffset: int=-1) -> Spectrum:
    L = Spectrum(0.0)

    nLights = int(len(scene.lights))
    if nLights == 0:
        return Spectrum(0.0)

    if lightNumOffset != -1:
        lightNum = int((sample.values_array_1d[lightNumOffset][0] * nLights))  # todo floor to int
    else:
        lightNum = int((random() * nLights))  # todo floor to int
    lightNum = min(lightNum, nLights - 1)

    light = scene.lights[lightNum]

    # Initialize light and bsdf samples for single light sample
    if lightSampleOffsets is not None and bsdfSampleOffsets is not None:
        lightSample = LightSample.create_from_sample(sample, lightSampleOffsets, 0)
        bsdfSample = BSDFSample.create_from_sample(sample, bsdfSampleOffsets, 0)
    else:
        lightSample = LightSample.create_from_random()
        bsdfSample = BSDFSample.create_from_random()
    Ld = EstimateDirect(scene, renderer, light, p, n, wo, time, bsdf, lightSample, bsdfSample,
                        BxDFType.BSDF_ALL & ~BxDFType.BSDF_SPECULAR)
    return Ld * float(nLights)
Пример #2
0
def UniformSampleAllLights(scene: Scene, renderer: Renderer, p: Point3d, n: Normal, wo: Vector3d,
                           time: float, bsdf: BSDF, sample: Sample,
                           lightSampleOffsets: [LightSampleOffsets],
                           bsdfSampleOffsets: [BSDFSampleOffsets]) -> Spectrum:
    L = Spectrum(0.0)
    for i in range(len(scene.lights)):
        light = scene.lights[i]
        if lightSampleOffsets is None:
            nSamples = 1
        else:
            nSamples = lightSampleOffsets[i].nSamples

        # Estimate direct lighting from _light_ samples
        Ld = Spectrum(0.0)

        for j in range(nSamples):
            # Find light and BSDF sample values for direct lighting estimate
            if lightSampleOffsets is not None and bsdfSampleOffsets is not None:
                lightSample = LightSample.create_from_sample(sample, lightSampleOffsets[i], j)
                bsdfSample = BSDFSample.create_from_sample(sample, bsdfSampleOffsets[i], j)
            else:
                lightSample = LightSample.create_from_random()
                bsdfSample = BSDFSample.create_from_random()
            Ld += EstimateDirect(scene, renderer, light, p, n, wo, time, bsdf, lightSample, bsdfSample,
                                 BxDFType.BSDF_ALL & ~BxDFType.BSDF_SPECULAR)
        L += Ld / nSamples
    return L