This file is: issuesWithSphericalIsosurfaces.txt Numerical artefacts, somewhat often, show up with spherical isosurface shapes. With sphereical displacements of a f_sphere() function for a planet's surface, for example. The quick fix is often reducing the isosurface{}'s accuracy setting - or making the base isosurface size larger. In yuqk, there are additional options. All of these mitigations come with trade-offs that differ scene to scene. Reference the image file: issuesWithSphericalIsosurfaces.jpg while reading the paragraphs below. --- Row 1. The isosurface default accuracy is 0.001 which, with higher resolution images today, is often too large. If we change it to 0.0001, the image cleans up, but the cost for the isosurface goes up by 32%. You might need to set accuracy smaller, but don't needlessly make it extremely small. --- The yuqk fork has two additional features for artifacts like this. One is an isosurface{} 'jitter on' option and the other a global_setting{} 'shadow_tolerance ' setting. Row 2. Left column again uses default settings. The middle column uses 'jitter on' in the isosurface{} block. Use of jitter drives the render time up by 7.7%. Row 3. Left column using default settings. The middle column sets the global shadow tolerance to 1e-2 over the default of 1e-3. No additional CPU cost, but the option comes with trade-offs, not the least due it being a global setting. --- Row 4. Left column using default settings. The middle column makes the isosurface f_sphere() radius is 10x larger. This is effectively Row 1's approach by other means. The increase in size has made the accuracy setting more effective by 10x. The cost of the render increased by 32% - the same as Row 1. --- // Playpen scene for various options and images discussed herein. #version unofficial 3.8; // yuqk #if (file_exists("version.inc")) #include "version.inc" #end #if (!defined(Fork_yuqk)) #error "This POV-Ray SDL code requires the yuqk fork." #end global_settings { assumed_gamma 1 shadow_tolerance 0.001 } #declare Grey50 = srgb <0.5,0.5,0.5>; background { Grey50 } #declare Camera00 = camera { perspective location <3,3,-3.001> sky y angle 35 right x*(image_width/image_height) look_at <0,0,0> } #declare VarOrthoMult = 2.0/max(image_width/image_height,image_height/image_width); #declare Camera01z = camera { orthographic location <0,0,-2> direction z right VarOrthoMult*x*max(1,image_width/image_height) up VarOrthoMult*y*max(1,image_height/image_width) } #declare Camera01y = camera { orthographic location <0,2,0> direction -y right VarOrthoMult*x*max(1,image_width/image_height) up VarOrthoMult*z*max(1,image_height/image_width) } #declare Camera01x = camera { orthographic location <2,0,0> direction -x right VarOrthoMult*z*max(1,image_width/image_height) up VarOrthoMult*y*max(1,image_height/image_width) } #declare White = srgb <1,1,1>; #declare Light00 = light_source { <150,250,-250>, White } #declare Red = srgb <1,0,0>; #declare CylinderX = cylinder { -1*x, 1*x, 0.01 pigment { Red } } #declare Green = srgb <0,1,0>; #declare CylinderY = cylinder { -1*y, 1*y, 0.01 pigment { Green } } #declare Blue = srgb <0,0,1>; #declare CylinderZ = cylinder { -1*z, 1*z, 0.01 pigment { Blue } } #include "functions.inc" // Function f_sphere defined in functions.inc #declare Fn00 = function (x,y,z) { f_sphere(x,y,z,0.8) } #declare Iso99 = isosurface { function { Fn00(x,y,z) } contained_by { box { -2,2 } } threshold 0 accuracy 0.001 jitter off max_gradient 1.1 pigment { Green } } //--- scene --- // camera { Camera00 } light_source { Light00 } // camera { Camera01x } // camera { Camera01y } camera { Camera01z } object { CylinderX } object { CylinderY } object { CylinderZ } object { Iso99 }