Пример #1
0
    public Vector3 ImportanceSampleDescretePDF(Vector2 xi, DelegatePDF PDF)
    {
        float Phi      = xi.x;
        float CosTheta = xi.y;
        // Remap from [-1.0, 1.0] to [0.0 1.0]
        float Param = CosTheta * 0.5f + 0.5f;

        return(SphericalToCartesian(Phi, SampleDescretePDF(Param)) * PDF(CosTheta));
    }
Пример #2
0
    public void PrecomputeDescretePDF(float MinBound, float MaxBound, DelegatePDF PDF)
    {
        int DescreteCDF_NumSamples = 1 << DescreteCDFNumSamplesPowOf2;

        if (DescreteCDF != null && DescreteCDF.Length != DescreteCDF_NumSamples)
        {
            DescretePDF = null;
            DescreteCDF = null;
        }

        if (DescreteCDF == null)
        {
            DescretePDF = new float[DescreteCDF_NumSamples];
            DescreteCDF = new float[DescreteCDF_NumSamples];

            int NumIntervals = DescreteCDF_NumSamples - 1;

            float Dx = (MaxBound - MinBound) / (float)NumIntervals;

            DescretePDFMinBound = MinBound;
            DescretePDFMaxBound = MaxBound;

            DescretePDF[0] = PDF(Mathf.Cos(MinBound));
            DescreteCDF[0] = 0.0f;

            for (int i = 1; i < NumIntervals; ++i)
            {
                float X    = MinBound + Dx * (float)i;
                float PdfX = PDF(Mathf.Cos(X));

                DescretePDF[i] = PdfX;
                DescreteCDF[i] = PdfX * Mathf.Abs(Dx) + DescreteCDF[i - 1];
            }

            DescretePDF[NumIntervals] = PDF(Mathf.Cos(MaxBound));
            DescreteCDF[NumIntervals] = 1.0f;
        }
    }