| 909 | } |
| 910 | |
| 911 | static void GenerateGaussianIrradianceTable(float sharpness, const wchar* filePath) |
| 912 | { |
| 913 | std::string output; |
| 914 | |
| 915 | const uint64 NumPoints = 50; |
| 916 | for(uint64 pointIdx = 0; pointIdx < NumPoints; ++pointIdx) |
| 917 | { |
| 918 | float theta = Pi * pointIdx / (NumPoints - 1.0f); |
| 919 | Float3 localSGDir = Float3(std::sin(-theta), 0.0f, std::cos(-theta)); |
| 920 | |
| 921 | const uint64 SqrtNumSamples = 64; |
| 922 | const uint64 NumSamples = SqrtNumSamples * SqrtNumSamples; |
| 923 | float sum = 0.0f; |
| 924 | for(uint64 sampleIdx = 0; sampleIdx < NumSamples; ++sampleIdx) |
| 925 | { |
| 926 | Float2 samplePoint = SampleCMJ2D(int32(sampleIdx), int32(SqrtNumSamples), int32(SqrtNumSamples), int32(pointIdx)); |
| 927 | Float3 sampleDir = SampleCosineHemisphere(samplePoint.x, samplePoint.y); |
| 928 | sum += std::exp(sharpness * (Float3::Dot(sampleDir, localSGDir) - 1.0f)); |
| 929 | } |
| 930 | |
| 931 | sum *= (Pi / NumSamples); |
| 932 | |
| 933 | output += MakeAnsiString("%f,%f\n", theta, sum); |
| 934 | } |
| 935 | |
| 936 | WriteStringAsFile(filePath, output); |
| 937 | } |
| 938 | |
| 939 | static void GenerateSGInnerProductIrradianceTable(float sharpness, const wchar* filePath) |
| 940 | { |
nothing calls this directly
no test coverage detected