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)); }
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; } }