@@ -50,6 +50,9 @@ int main(int argc, char** argv) {
50
50
if (argc > 3 ) parameters = mcrt::ParameterImporter::load (argv[3 ]);
51
51
if (argc > 4 ) return usage (argc, argv); // Now it's just too many.
52
52
53
+ // Shorthands for enabling or disabling the parallel framework under run-time. TODO: OpenMPI.
54
+ bool openmp { parameters.parallelFramework == mcrt::Parameters::ParallelFramework::OPENMP };
55
+
53
56
// Note that render background will be transparent.
54
57
mcrt::Image renderImage { parameters.resolutionWidth ,
55
58
parameters.resolutionHeight };
@@ -64,24 +67,34 @@ int main(int argc, char** argv) {
64
67
65
68
// ====================================================
66
69
67
- size_t pixelsRendered { 0 };
68
- double renderProgress { 0.0 };
69
- const double pixelCount = renderImage.getSize ();
70
- glm::dvec3 eyePoint { sceneCamera.getEyePosition () };
70
+ size_t rowsRendered { 0 }; // Shared resource.
71
+ const double rowCount = renderImage.getHeight ();
72
+ const glm::dvec3 eyePoint { sceneCamera.getEyePosition () };
73
+
74
+ #pragma omp parallel for schedule(dynamic) if (openmp)
75
+ for (size_t y = 0 ; y < renderImage.getHeight (); ++y) {
76
+ double renderProgress = rowsRendered / rowCount;
77
+
78
+ #pragma omp critical
79
+ printProgress (" Ray tracing: " ,
80
+ renderProgress);
81
+ #pragma omp atomic
82
+ ++rowsRendered;
71
83
72
- for (size_t y { 0 }; y < renderImage.getHeight (); ++y) {
73
- renderProgress = pixelsRendered / pixelCount;
74
- printProgress (" Ray tracing: " , renderProgress);
75
- for (size_t x { 0 }; x < renderImage.getWidth (); ++x) {
84
+ // ------------------------------------------------
85
+
86
+ for (size_t x = 0 ; x < renderImage.getWidth (); ++x) {
76
87
// Bit of a hack for now, we probably want to sample from the pixel plane...
77
88
glm::dvec3 viewPlanePoint { sceneCamera.getPixelCenter (renderImage, x, y) };
78
89
glm::dvec3 rayDirection { glm::normalize (viewPlanePoint - eyePoint) };
79
90
mcrt::Ray rayFromViewPlane { viewPlanePoint, rayDirection };
80
91
81
92
// And also average these pixel color based on the samples.
82
93
glm::dvec3 pixelColor { scene.rayTrace (rayFromViewPlane) };
83
- renderImage.pixel (x, y) = pixelColor; ++pixelsRendered;
94
+ renderImage.pixel (x, y) = pixelColor;
84
95
}
96
+
97
+ // ------------------------------------------------
85
98
}
86
99
87
100
// ====================================================
0 commit comments