Scatter 🌱 - The Scattering Tool of blender 2.8

Hello and welcome to Scatter main thread !

Feel free to

  • report bugs.
  • talk about anything Scattering related.
  • ask questions (not covered in the docs please);
  • requests stuff.
  • ect…

I’m posting exclusive news/previews here and i check the thread regularly so don’t hesitate to ask :slightly_smiling_face:

Blender Market:


Original First post:

I spend maybe 4 hours this morning working on this meadow (only shading and particles)
i just want to make a topic speaking about the subject

After reading this article here below tried my best to recreate this exact scene in blender.

And this is the result:

Important steps:

  1. have a bunch of different variety of grasses/leaves/clovers… ect
  2. make sure to have different models of your grass, some in clusters, in different sizes and radius.
  3. make sure the terrain is naturally displaced and not flat.
  4. use a grass texture with little roots and different tones of grasses for the base plane.
  5. make sure that the material and translucency of your grass is accurate
  6. the material of the grass need to be wet enoug. 0.4 roughness is perfect for this scene
  7. Distribute your differents grasses models with a cluster map like this below using procedural black and white texture
  8. Tweak the material of the grass with a procedural texture, so that you can have different shade of green/yellow/dead grass tones, get rid of uniform colors. For the aldebeo AND translucency.
  9. in your scene always have some shadow to give this grass some relief

and its done.

While addons like graswald or grass-essential do excellent work for the grass material and model, there’s still a lot of work to do for clustering the different species with various clustering maps, reworking the material for color variation, and a lot features forest pack like missing.

i’d really like to see an addon that can do that within blenders

so let’s do it !

ps: This topic is also a work in progress topic from the very beginning, you can scroll through Scatter development starting at the posts belows


I’m curious as to what you mean by ‘reworking the material for color variation’ because graswald does have things I would suggest are of that nature.

As for clustering, I have been thinking of a way to procedurally generate vertex groups that I think would be really powerful in controlling distributions. But being able to do things directly with textures is also powerful in it’s own right. I’ll definitely need to make a few scenes and experiment before I have a concrete idea of what options are good and how to integrate it into a system like graswald—because unless you can simplify the texturing system or provide new functionality, there is little point in copying the settings to a different panel imo.

But I like that you are bringing this up, it’s a good topic for discussion.

On that note, any settings you found particularly interesting?


Looks pretty good. Want to share grass translucency values (or ranges) you used in this shader?


I was speaking of this

I don’t remember graswald having’ this ? But it’s easy to do. The problematic Part is the automatic cluster distribution.

I already tried to do an automatic cluster distribution code based on pre created texture set on global. It’s a really simple code but I hope it can help you. I’ll share it later this evening.

Seems like a bad idea. An automatic creation of various cluster maps with a texture seems more volatile. It doesn’t have any geometrical requirements. Could be used for flat surface and be re-used once the texture is present in the scene.

1 Like

I meant for effects like: leaves cluster around tree objects, plants shy away from shade, etc: things that depend on other geometry in the scene.

Ok, I have an idea on how to automate that, I’ll explore it’s feasibility.

Graswald currently has a dead patches property which does that, but has few customization options

1 Like

If you’re incorporating this in graswald then look at how forestpack does this. They also use textures like BD3D suggests. The problem with vertex group clusters is that it will depend on a highpoly surface being populated with your clusters. Being able to populate it on every surface (single poly or highpoly) is a must, it should not be dependend of the polycount. It should work the same on every surface, same density of particles and same pattern, across all surfaces in your scene that have this cluster aplied to.

The example DB3D showed is very promising!

This workflow with grass patches would be awesome as it will be usable on bigger surfaces also. A bigger patch of grass in one particle will make the viewport more responsive. I’ve tested it and it works as a charm even on huge terrains.

Is it possible to have your cluster pattern detect edges? Like stop 40cm away from the edge of the surface ? In sketchup there is the skatter plugin who solves the problem of patches on big surfaces by dividing the grass in two particle system, one with a very small patch of grass (like 10cm circle) for the border of the lawn near the edge of the surface and then one for the rest with a bigger grasspatch (like 50cm large).

If you don’t do this you’ll either have grass patches overflowing in areas where there should be no grass or have jagged edges where grass is missing.


Is it possible to have your cluster pattern detect edges?

i don’t know if it is possible to do this within the old texture editor. This thing is a pain, it need to be replaced with the cycles node editor… seriously. …

Is there a way to do it within this editor ?

If you don’t do this you’ll either have grass patches overflowing in areas where there should be no grass or have jagged edges where grass is missing.


If you’re incorporating this in graswald then look at how forestpack does this.

could you elaborate ? i’d really like to understand how forest pack work, unfortunately i’m not allowed to use 3ds max due to allergies.

I also dream of an automatic multi species one click to set up grass clustering tool. @KareemAlgalaly let me know if i can help, im new to python but if i can help, tell me.


Sorry I looked back at it and it’s not the clusters but the distribution of the particles that are based on maps (I don’t know on what the clusters are based)

see this video

I don’t use max myself so I only saw the feature from the videos or from the small trial I did a couple of months ago but from what I saw it’s super powerful and flexible. Look at the other features if you want some inspiration, it’s crazy how good that forestpack plugin is. I wish they made a blender version of it.


yes that’s what i meant by clustering the particles


But i feel like it’s quite over complex for just clustering some vegetations ? A simple version could be done in blender with less of an headache.

1 Like

Like this one for exampe


indeed that’s a really great example.
The only problem is that proxies for blender are not here yet.

1 Like

I really appreciate your effort guys, having distribution maps in Graswald would be so awesome.
A proxy system is what I am missing as well. You might want to check out this script which I use as a workaround for now


Really nice ! Could the vertex clouds have colors ?

1 Like

Okay, i got a tons of ideas for a scattering tool for blender.

Ideas like a custom homemade proxy system, automatic two click particles distribution with fully customizable parameters slots, if pablo remesher will be in the modifier stack soon I also could do an automatic terrain displacement + custom settings and slots.

This Could be a killer addon. I’ll start today.

1 Like

That’s my biggest problem with the script. While performance increase is surprisingly good, readability suffers with increasing amounts of particles. I’ve been searching a solution but that will most likely have to be hard coded in the ‘loose points’ draw code.

I have no idea how to achieve that:sweat_smile:


Maybe ask on the blender stack exchange ? :slightly_smiling_face:

1 Like

I did :slight_smile: but apparently it’s for questions about usage and python coding, not about blender’s source code. On devtalk I’m still hoping for someone to answer. Maybe I also give it a try in the developer chat :smiley:

ahah i’ll add a 50$ reward for the response in a month if there’s nothing new with it.

It could be a dream to have this kind of point cloud inside of blender, by the way isn’t it in brecht to do list ?


Well, then let’s make it 100$ for a good response :joy:

As far as I know, the last proposal about a proper proxy system on right-click select was declined. Brecht mentioned that alembic and USD integration could handle that and much more but don’t ask me how.

About a week ago, I proposed point cloud display myself to have that at least.
If I’d know how I would try it myself.


i read months ago that brecht was really interrested in point could and wanted to incorpore a point cloud system in blender. It’s in his to do list. I don’t know where to find this info again.

import bpy

context = bpy.context
scene = context.scene
A = context.object

def find_collection(context, item):
    collections = item.users_collection
    if len(collections) > 0:
        return collections[0]
    return context.scene.collection

def make_collection(collection_name, parent_collection):
    if collection_name in
        new_collection =
        return new_collection
slotname = "Super Slutt"
pref = "Scatter:["+ +"]["+ slotname +"] v."
i = 1
name = "%s%d" % (pref, i)
while A.modifiers.get(name):    
    i += 1
    name = "%s%d" % (pref, i)

m =, type='PARTICLE_SYSTEM')

for o in bpy.context.selected_objects:
    o_collection = find_collection(bpy.context, o)
    new_collection = make_collection(name , o_collection)

ps = m.particle_system = name = name
ps.settings.type = 'HAIR'
ps.settings.render_type = 'COLLECTION'
ps.settings.instance_collection =[name]
ps.settings.particle_size = 0.25 #FUTURE PARAMETERS = scale #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.hair_length = 4 #FUTURE PARAMETERS = hair length #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.size_random = 0.35 #FUTURE PARAMETERS = scale randomness

bpy.context.object.particle_systems[name].seed = i #FUTURE PARAMETERS

ps.settings.display_percentage = 100 #FUTURE PARAMETERS

ps.settings.use_advanced_hair = True
ps.settings.use_rotations = True
ps.settings.rotation_factor_random = 1
ps.settings.phase_factor = 1
ps.settings.phase_factor_random = 2 #FUTURE PARAMETERS = randomize phase
texturename = name[-1].name = texturename[texturename].type = 'CLOUDS' #LATER SUPPORT OTHER NOISE TYPE AND OPTIONS[texturename].noise_scale = 0.45 #FUTURE PARAMETERS = Scattering noise scale #LATER GIVE VARIATION RANDOMNESS ON RANGE[texturename].noise_depth = 0 #FUTURE PARAMETERS = Scattering noise depth #LATER GIVE VARIATION RANDOMNESS ON RANGE[texturename].contrast = 3 #FUTURE PARAMETERS = Scattering border (contrast) #LATER GIVE VARIATION RANDOMNESS ON RANGE[texturename].intensity = 1 #FUTURE PARAMETERS = Scattering range (brightness) #LATER GIVE VARIATION RANDOMNESS ON RANGE 

Okay everyone, i change the little code from above, the texture scattering map are now entirely made within the code. No need to have a map in the .blend

ps.settings.texture_slots.add().texture =[texturename]
ps.settings.texture_slots[0].blend_type = 'MULTIPLY'
ps.settings.texture_slots[0].use_map_time = False
ps.settings.texture_slots[0].use_map_density = True
ps.settings.texture_slots[0].density_factor = 1 #FUTURE PARAMETERS = Scattering density Influence
ps.settings.texture_slots[0].use_map_length = True 
ps.settings.texture_slots[0].length_factor = 0.3 #FUTURE PARAMETERS = Scattering size Influence
ps.settings.texture_slots[0].scale[1] = 1 #FUTURE PARAMETERS = scalex #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].scale[2] = 1 #FUTURE PARAMETERS = scaley #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].scale[0] = 1 #FUTURE PARAMETERS = scalez #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].offset[1] = 0 #FUTURE PARAMETERS = offsetx #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].offset[2] = 0 #FUTURE PARAMETERS = offsety #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].offset[0] = 0 #FUTURE PARAMETERS = offsetz #LATER GIVE VARIATION RANDOMNESS ON RANGE 
ps.settings.texture_slots[0].texture_coords = 'GLOBAL'

I will slowly create the addon step by step on this thread for now.