diff --git a/src/graphics/IBL.cpp b/src/graphics/IBL.cpp index 86e057c68..735accc24 100644 --- a/src/graphics/IBL.cpp +++ b/src/graphics/IBL.cpp @@ -104,9 +104,12 @@ static void projectSH(Color *CubemapFace[6], size_t edge_size, } float wh = float(edge_size * edge_size); + float b0 = 0., b1 = 0., b2 = 0., b3 = 0., b4 = 0., b5 = 0., b6 = 0., b7 = 0., b8 = 0.; + float r0 = 0., r1 = 0., r2 = 0., r3 = 0., r4 = 0., r5 = 0., r6 = 0., r7 = 0., r8 = 0.; + float g0 = 0., g1 = 0., g2 = 0., g3 = 0., g4 = 0., g5 = 0., g6 = 0., g7 = 0., g8 = 0.; for (unsigned face = 0; face < 6; face++) { -#pragma omp parallel for +#pragma omp parallel for reduction(+ : b0, b1, b2, b3, b4, b5, b6, b7, b8, r0, r1, r2, r3, r4, r5, r6, r7, r8, g0, g1, g2, g3, g4, g5, g6, g7, g8) for (int i = 0; i < int(edge_size); i++) { for (unsigned j = 0; j < edge_size; j++) @@ -126,39 +129,69 @@ static void projectSH(Color *CubemapFace[6], size_t edge_size, float g = CubemapFace[face][edge_size * i + j].Green; float r = CubemapFace[face][edge_size * i + j].Red; - blueSHCoeff[0] += b * Y00[face][idx] * solidangle; - blueSHCoeff[1] += b * Y1minus1[face][idx] * solidangle; - blueSHCoeff[2] += b * Y10[face][idx] * solidangle; - blueSHCoeff[3] += b * Y11[face][idx] * solidangle; - blueSHCoeff[4] += b * Y2minus2[face][idx] * solidangle; - blueSHCoeff[5] += b * Y2minus1[face][idx] * solidangle; - blueSHCoeff[6] += b * Y20[face][idx] * solidangle; - blueSHCoeff[7] += b * Y21[face][idx] * solidangle; - blueSHCoeff[8] += b * Y22[face][idx] * solidangle; + b0 += b * Y00[face][idx] * solidangle; + b1 += b * Y1minus1[face][idx] * solidangle; + b2 += b * Y10[face][idx] * solidangle; + b3 += b * Y11[face][idx] * solidangle; + b4 += b * Y2minus2[face][idx] * solidangle; + b5 += b * Y2minus1[face][idx] * solidangle; + b6 += b * Y20[face][idx] * solidangle; + b7 += b * Y21[face][idx] * solidangle; + b8 += b * Y22[face][idx] * solidangle; - greenSHCoeff[0] += g * Y00[face][idx] * solidangle; - greenSHCoeff[1] += g * Y1minus1[face][idx] * solidangle; - greenSHCoeff[2] += g * Y10[face][idx] * solidangle; - greenSHCoeff[3] += g * Y11[face][idx] * solidangle; - greenSHCoeff[4] += g * Y2minus2[face][idx] * solidangle; - greenSHCoeff[5] += g * Y2minus1[face][idx] * solidangle; - greenSHCoeff[6] += g * Y20[face][idx] * solidangle; - greenSHCoeff[7] += g * Y21[face][idx] * solidangle; - greenSHCoeff[8] += g * Y22[face][idx] * solidangle; + g0 += g * Y00[face][idx] * solidangle; + g1 += g * Y1minus1[face][idx] * solidangle; + g2 += g * Y10[face][idx] * solidangle; + g3 += g * Y11[face][idx] * solidangle; + g4 += g * Y2minus2[face][idx] * solidangle; + g5 += g * Y2minus1[face][idx] * solidangle; + g6 += g * Y20[face][idx] * solidangle; + g7 += g * Y21[face][idx] * solidangle; + g8 += g * Y22[face][idx] * solidangle; - redSHCoeff[0] += r * Y00[face][idx] * solidangle; - redSHCoeff[1] += r * Y1minus1[face][idx] * solidangle; - redSHCoeff[2] += r * Y10[face][idx] * solidangle; - redSHCoeff[3] += r * Y11[face][idx] * solidangle; - redSHCoeff[4] += r * Y2minus2[face][idx] * solidangle; - redSHCoeff[5] += r * Y2minus1[face][idx] * solidangle; - redSHCoeff[6] += r * Y20[face][idx] * solidangle; - redSHCoeff[7] += r * Y21[face][idx] * solidangle; - redSHCoeff[8] += r * Y22[face][idx] * solidangle; + r0 += r * Y00[face][idx] * solidangle; + r1 += r * Y1minus1[face][idx] * solidangle; + r2 += r * Y10[face][idx] * solidangle; + r3 += r * Y11[face][idx] * solidangle; + r4 += r * Y2minus2[face][idx] * solidangle; + r5 += r * Y2minus1[face][idx] * solidangle; + r6 += r * Y20[face][idx] * solidangle; + r7 += r * Y21[face][idx] * solidangle; + r8 += r * Y22[face][idx] * solidangle; } } } + + blueSHCoeff[0] = b0; + blueSHCoeff[1] = b1; + blueSHCoeff[2] = b2; + blueSHCoeff[3] = b3; + blueSHCoeff[4] = b4; + blueSHCoeff[5] = b5; + blueSHCoeff[6] = b6; + blueSHCoeff[7] = b7; + blueSHCoeff[8] = b8; + + redSHCoeff[0] = r0; + redSHCoeff[1] = r1; + redSHCoeff[2] = r2; + redSHCoeff[3] = r3; + redSHCoeff[4] = r4; + redSHCoeff[5] = r5; + redSHCoeff[6] = r6; + redSHCoeff[7] = r7; + redSHCoeff[8] = r8; + + greenSHCoeff[0] = g0; + greenSHCoeff[1] = g1; + greenSHCoeff[2] = g2; + greenSHCoeff[3] = g3; + greenSHCoeff[4] = g4; + greenSHCoeff[5] = g5; + greenSHCoeff[6] = g6; + greenSHCoeff[7] = g7; + greenSHCoeff[8] = g8; } void SphericalHarmonics(Color *CubemapFace[6], size_t edge_size, float *blueSHCoeff, float *greenSHCoeff, float *redSHCoeff)