Some scenes (in particular, boards with a lot of tallish through-hole 
components) seem to suffer pretty badly from the low diffuseness of the light 
sources the raytracer uses:

https://misc.c4757p.com/way-too-shadowy.png

Currently, this is directly coded, but it can be parameterized really easily. 
I've attached a patch to enable this and bump up the number of light sources 
from 8 to 64. The tradeoff here is that the render time scales roughly 
linearly, so obviously this can't just be increased all the time.

Here's an example with 64 sources, roughly the same scene. It looks 
significantly better to my eye:

https://misc.c4757p.com/8x-sources-with-intensity-comp.png

I don't really have time to contribute a full patch, but I really would like to 
see this added as a runtime configurable option in the GUI. Is that something 
that somebody would be interested in doing?

(Resent as the first mail seems to have gotten lost, apologies if two come 
through)

-Alexis
diff --git a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp
index 2910ccdf7e..3f610e42c0 100644
--- a/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp
+++ b/3d-viewer/3d_rendering/3d_render_raytracing/c3d_render_createscene.cpp
@@ -877,32 +877,30 @@ void C3D_RENDER_RAYTRACING::reload( REPORTER *aStatusTextReporter )
                                          SFVEC3F( light_top_bottom ) ) );
     */
 
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 1.0f / 8.0f,
-                                                               glm::pi<float>() * 1 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 1.0f / 8.0f,
-                                                               glm::pi<float>() * 3 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 1.0f / 8.0f,
-                                                               glm::pi<float>() * 5 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 1.0f / 8.0f,
-                                                               glm::pi<float>() * 7 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-
-
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 7.0f / 8.0f,
-                                                               glm::pi<float>() * 1 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 7.0f / 8.0f,
-                                                               glm::pi<float>() * 3 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 7.0f / 8.0f,
-                                                               glm::pi<float>() * 5 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
-    m_lights.Add( new CDIRECTIONALLIGHT( SphericalToCartesian( glm::pi<float>() * 7.0f / 8.0f,
-                                                               glm::pi<float>() * 7 / 4.0f ),
-                                         SFVEC3F( light_directional_intensity ) ) );
+    const int num_sources = 64;
+    const float intensity_factor = 1.f / sqrtf(num_sources / 8.f);
+    const float light_dir_intensity_compensated = light_directional_intensity * intensity_factor;
+
+    for (int i = 0; i < num_sources / 2; i += 2) {
+        m_lights.Add(
+            new CDIRECTIONALLIGHT(
+                SphericalToCartesian(
+                    glm::pi<float>() * 1.0f / 8.0f,
+                    glm::pi<float>() * (1 + i) / ((float) (num_sources / 2))
+                ),
+                SFVEC3F( light_dir_intensity_compensated )
+            )
+        );
+        m_lights.Add(
+            new CDIRECTIONALLIGHT(
+                SphericalToCartesian(
+                    glm::pi<float>() * 7.0f / 8.0f,
+                    glm::pi<float>() * (1 + i) / ((float) (num_sources / 2))
+                ),
+                SFVEC3F( light_dir_intensity_compensated )
+            )
+        );
+    }
 
 
     // Create an accelerator
_______________________________________________
Mailing list: https://launchpad.net/~kicad-developers
Post to     : kicad-developers@lists.launchpad.net
Unsubscribe : https://launchpad.net/~kicad-developers
More help   : https://help.launchpad.net/ListHelp

Reply via email to