Skip to main content
2 of 5
added 608 characters in body
kglr
  • 403.6k
  • 18
  • 506
  • 962

Update: In versions 12.1+, we can use the directive SurfaceAppearance["TextureShading", Texture[img]] to texturize any surface with img:

reg = TriangulateMesh[BoundaryDiscretizeRegion[Rectangle[]], MaxCellMeasure -> .02];

disks = Graphics[{Red, MeshPrimitives[reg, 2] /. Polygon -> (Apply[Disk] @* Insphere)}];

 Graphics3D[{SurfaceAppearance["TextureShading", Texture[disks]], 
   KnotData["Trefoil", "ImageData"]}, 
  Boxed -> False, ImageSize -> Large] 

enter image description here

Original answer:

We can use the new-in-12.1 directive HalfToneShading:

Graphics3D[{HalftoneShading[#, Red], KnotData["Trefoil", "ImageData"]}, 
 Lighting -> "Neutral", ImageSize -> 250, Boxed -> False, 
    ViewPoint -> {1.5, -1.5, 4.}] & /@ {.3, .5, .7} // Row 

enter image description here

Needless to say, this approach is not match for cvgmt's approach in terms of flexibility and beauty of the pictures produced.

To get some flexibility in controlling the density of shapes, we can use the options of SurfaceAppearance to define a directive with options:

Options[surfaceAppearance] = {"StepCount" -> 1, "Tiling" -> {5, 5}, 
   "FeatureColor" -> Red, "UseScreenSpace" -> 0, "IsTwoTone" -> 1, 
   "LuminanceModifier" -> 0.0, "Shape" -> "Disk"};

surfaceAppearance[opts : OptionsPattern[surfaceAppearance]] := 
 SurfaceAppearance["RampShading", 
  Sequence @@ FilterRules[{opts, Options[surfaceAppearance]}, Except["Shape"]], 
  "Arguments" -> {"HalftoneShading", 0.5, Red, OptionValue["Shape"]}, 
  EdgeForm[], Texture["HalftoneShading" <> OptionValue["Shape"]]]

Examples:

Graphics3D[{surfaceAppearance[], KnotData["Trefoil", "ImageData"]},
  Lighting -> "Accent", Boxed -> False, ViewPoint -> {1.5, -1.5, 4.}]

enter image description here

Use surfaceAppearance["Tiling" -> {15, 15}] to get:

enter image description here

Use surfaceAppearance["UseScreenSpace" -> 1, "StepCount" -> 2, "Tiling" -> {7, 7}] to get:

enter image description here

Use surfaceAppearance["Tiling" -> {15, 15}, "Shape"->"Triangle"] to get:

enter image description here

Use surfaceAppearance["StepCount" -> 3,"Tiling" -> {10,10},"Shape" -> "Hexagon"] to get:

enter image description here

kglr
  • 403.6k
  • 18
  • 506
  • 962