Working With Meshes in Roblox
Most people coming into Roblox development hit a wall pretty quickly when they realize the built-in parts don't cut it anymore. You've got your brick, your sphere, your cylinder - but then you want something that actually looks like an actual object instead of a primitive. That's when you start running into Meshes Roblox workflows, and honestly, it's not as clean as the documentation makes it sound. The basics are straightforward. You model something in Blender or Maya, export it as an FBX or OBJ, upload it to Roblox Studio through the Create tab, and it becomes a MeshPart you can weld into your game. The catch is that Roblox has some real quirks around mesh processing that will bite you if you don't know what to watch for.
Meshes Roblox Export Pipeline
When I first started shipping custom meshes for a physics-heavy parkour map I was building, I thought I had the hang of it. Wrong. The first problem is triangulation. Roblox's mesh importer doesn't handle quads gracefully - it triangulates them on import, and depending on your UV layout, you can end up with visible seams running through your texture that weren't there in your original model. The workaround is to convert everything to triangles before you export. Blender's Remesh modifier or just manually retopo-ing the tricky areas saves you from pulling your hair out later. Vertex count matters more than you'd think. Roblox has a hard cap somewhere around 65,000 vertices per mesh for most use cases, and even before you hit that, the engine starts stuttering during load. I learned this the hard way when a single decorative archway I modeled at 80k vertices caused a three-second freeze every time players entered the room. Dropped it to 45k by simplifying the bevels and the problem vanished. There's also the material system to deal with. Unlike Unity or Unreal, Roblox meshes don't automatically pick up PBR values from your export. You're working with the old Material enum - either picking from the built-in options or attaching a Decal or SurfaceGui. If you need actual metallic/roughness workflows, you're looking at using Roblox's newer PBR material support, which is still maturing and doesn't play nice with every mesh setup.
Common Pitfalls I've Hit
Scale is another thing that sneaks up on you. Roblox uses studs as its unit, and one stud roughly equals one meter in real-world scale. When you export a mesh from Blender at default units, it usually imports at the right size. But if your source model has a different scale setting - say you modeled in centimeters - everything appears ten times too small and you spend an hour wondering why your doorframe fits through a keyhole. Normals flip sometimes during import, especially on meshes with non-manifold geometry or overlapping UV islands. I had a custom prop where half the faces were rendering inside-out after import, creating this weird ghostly effect. The fix was going back to Blender, ensuring all faces were consistently oriented with Recalculate Outside, and checking for any non-planar quads before export. LODs don't exist natively in Roblox the way they do elsewhere. You have to manually create multiple versions of your mesh at different detail levels and switch between them using scripts or the Distance property on the MeshPart. It's tedious but necessary if you want decent performance on lower-end devices. I usually keep three versions: full detail for close-up props, medium for mid-range objects, and a bare-bones silhouette mesh for distant background pieces.
Get the Full Details

Here's something the official docs barely mention: mesh welding. When you have multiple MeshParts touching each other in your scene, Roblox doesn't automatically combine them for rendering. Each one is a separate draw call. For a complex environment with dozens of small props, this kills your frame rate on mobile. The solution is to use the Weld constraint to merge them into a single part, or better yet, combine them into one mesh file before importing. I built a simple Blender add-on that batches nearby objects into single exports, and it cut my draw calls from 200+ down to about 40 on a dense indoor scene.
Performance Numbers That Matter
From my experience building a multiplayer survival game with heavy customization, here's what actually moves the needle: Keep individual mesh vertex counts under 20k for anything that'll be on screen more than five meters away. Above that, you start seeing micro-stutters on mid-range phones. Texture size is equally important - a 4k texture on a small prop is overkill and wastes memory. I stick to 1024x1024 for hero assets and 512x512 for everything else. Compressed texture formats like BC7 help, but Roblox handles their own compression on upload, so you don't need to worry about that step. The biggest hidden cost is actually mesh count, not vertex count. A thousand simple meshes will tank performance faster than fifty complex ones, because each mesh is a draw call. Batch your static geometry. Group your decorations. Export them as single files when possible.
If you're building something with hundreds of unique props, consider using Roblox's Decal system instead of full meshes for surface details. A flat textured plane with a decal is dramatically cheaper than a detailed mesh, and from player distance, you often can't tell the difference. I swapped out 60 detailed fence posts for simple planes with wood texture decals on one of my maps, and the mobile frame rate jumped from 30 to 55 fps without anyone noticing visually.

When Meshes Just Won't Work
Sometimes the right answer isn't a mesh at all. If you need something that deforms dynamically - like cloth, soft body physics, or characters that need skeleton animation beyond basic rigging - Roblox's mesh system struggles. You're better off using RigAttachments with animated character models, or leaning on third-party animation libraries like Rodux or custom tweening solutions. Procedural geometry is another case where meshes fight you. If you need terrain that changes based on player interaction or buildings that assemble from pieces, mesh parts become rigid and unforgiving. Roblox's built-in Parts with union operations or the newer CSGBrush features handle dynamic geometry better, even if they lack the visual fidelity of imported meshes. For lighting and shadows, meshes don't participate in Roblox's baked lighting system the way native parts do. If shadow quality matters for your game's atmosphere, you're looking at either using native geometry for key structures or accepting that your custom meshes will cast flat, unmoving shadows. There are community workarounds involving projected textures and invisible shadow-casting planes, but they add complexity that might not be worth it for smaller projects.
The download link for Roblox Studio itself is straightforward - just get it from the official Roblox developer portal. Custom mesh tools and Blender plugins live mostly on GitHub and the Roblox Developer Forum. I found a useful automatic UV unwrapping script that handles the repetitive cleanup work, and a vertex count optimizer that flags problem meshes before you waste time importing them. At the end of the day, meshes in Roblox are powerful but finicky. They require more preprocessing than engines with mature asset pipelines, and the performance characteristics are easy to misjudge until you've shipped something actual. The developers who master this space tend to be obsessive about their export settings and vertex budgets from day one, rather than trying to optimize after the fact. I wish I'd been one of them from the start.