How to create PBR particles in roblox

Roblox currently as of posting this doesn’t have volumetric particles so this is really the only way to do it.

If you do not care for the tutorial and just want it now here is the download:
PBR_particles.rbxl (38.8 KB) :wink:

But for those who want the tutorial:

Firstly you’re going to want a meshpart that is properly unwrapped. The meshpart I’m using is This mesh

and if you want to directly paste it in:
rbxassetid://5806088147

The only thing you want to make sure of is whatever object you use each side doesn’t tile and only displays 1 texture


After doing this you’re going to want to insert a surface appearance and set it to transparency
SmokePart & SurfApp

Surface Appearance Properties
Following this you’re going to want to put your smoke texture in colormap. The texture I’m using is this

Here is the direct link as well:
rbxassetid://6956634044

After doing this your cube should look like this
Cube with image texture

To make the texture smoother you can change the transparency to 0.02 to make the texture smooth
0.02 transparency:
0.02 mp transparency
as shown here with 0.04 transparency it doesn’t really matter past 0.02:
0.04 mp transparency
after this scale the part down all the way to make it flat as if it was a texture.
Flat smoke image
Here is the normal map I used to make the texture have the whole effect

Here is the direct link as well:
rbxassetid://11032474555

put this texture inside of the normal map slot of the surface appearance
Surf App props
Next make a localscript and put it into StarterGui
image
Then paste this line of code in:

while wait() do
	game.Workspace.SmokePart.CFrame = CFrame.new(game.Workspace.SmokePart.Position, game.Workspace.CurrentCamera.CFrame.Position)
--Makes a new CFrame out of the SP's position and the Camera's.
end

Lastly make sure your Particle’s name is SmokePart or change the name in this code. This isn’t meant to be a complete module to making a PBR particle system but rather just making PBR particles.

Here is the final result:

Would you want a complete module centered around this:

  • Yes
  • No

0 voters

20 Likes

I would recommend using RunService.RenderStepped so it runs every frame instead of while wait() do but nice tutorial.

3 Likes

I agree but it was just to keep it simple honestly

Very good tutorial, I just have something to add:

If you want to further optimize the particles, you can actually use a mesh containing two planes that face away from each other for this and are slightly separated, this will drastically reduce the number of faces, from 6 to 2. I think for a cube it would reduce it from 12 to 4 triangles? Regardless, that gets rid of 2/3 of the faces which can help with performance if used in large quantities. Looks identical as well, left is the cube, right is the two planes.

If you want to take a look:
PBR_particles.rbxl (40.8 KB)

Here’s the mesh I used: PlaneMapped - Roblox

I also tried doing it with a single plane but the result was way different than what it should have looked like.

1 Like