Getting Your Meshes to Not Look Like Trash
Most people treat Roblox Studio Models as a grab-and-go asset pipeline. That is one way to use them, but if you only ever hit Import, you are leaving a lot of performance and visual quality on the table. I spent years going back and forth between Blender and the Roblox importer because my projects kept hitting micro-stutters in dense builds. The problem was never the concept—it was the pipeline choices I made before anything ever reached Studio. Here is how I actually handle it now.
Working with Roblox Studio Models in Practice
Export your mesh as an glTF 2.0 file (.gltf or .glb). That is the format Roblox parses best in 2024 and beyond. OBJ works, but you lose animation and PBR material routing unless you add extra steps. FBX is technically supported in some contexts, but it has historically caused normal map flips and LOD mismatch inside the Roblox pipeline. Once exported, open Roblox Studio and use Model Import, then choose your glTF file. You can also drop it directly into the viewport or the explorer window. Studio creates a MeshPart from the data. After that, you need to check the import options panel that appears on the right side. The most important checkbox is Compute Lighting Normals. When enabled, Studio recalculates normals from the surface geometry. This makes the model react properly to Studio lights and future lighting engines. Disable it if you baked normals manually and want to preserve them exactly.
Then set Resolution. Default is 100. For a simple prop, 100 is fine. For complex mechanical parts, 300 to 500 gives you smoother curvature without creating an unreasonably heavy triangle count. Going above 500 usually does not help and just increases load times for players who download your game. I hit a specific issue last year where imported meshes kept showing up with dark, crushed shading on half the faces. The import said it was fine, normals looked correct in Blender, but Studio rendered them wrong. The fix was disabling Compute Lighting Normals on import and instead using the Normal Map option if I had one baked. If you do not have a normal map, the alternative is importing with standard normals and then manually selecting the MeshPart right-click Mesh Recompute Lighting. That second step recalculates everything inside Roblox's geometry engine rather than relying on the incoming file data. It sounds like a small difference, but it resolves about 90 percent of shading issues I run into.
Get the Full Details

What Beginners Miss About These Imports
The biggest mistake is assuming that a mesh imported at high polygon count will look better at runtime. It does not. Roblox applies its own rendering optimizations during loading. Very high-poly models get decimated by the engine's internal simplifier anyway, so you might as well do it yourself first and control the shape of the reduction. Another common error is ignoring Material assignment. A raw MeshPart uses Roblox's default SmoothPlastic material unless you change it. You can assign materials through the Material property, but a cleaner approach is to name your Blender materials to match Roblox's built-in material names like Metal, Wood, Concrete, or Neon before you export. When Studio imports the glTF, it attempts to map those names automatically. This saves you from opening every single part and reassigning materials by hand, which is tedious and error-prone when you are working with a group of more than fifty pieces. Vertex colors are not imported through the standard glTF path in most versions of Studio. If you need vertex painting, you either have to bake it into the albedo texture or use a custom shader setup through Lighting and SurfaceAppearance objects. SurfaceAppearance lets you layer textures, wear, and roughness on top of the base mesh without changing the actual mesh file. It is slower to iterate on, but it keeps your game folder from becoming a mess of duplicated geometry.
Performance Reality Check
Roblox has hard limits on mesh complexity per draw call. A single MeshPart above roughly 50,000 triangles will begin to hurt mobile frame rates noticeably. I learned that the hard way when I imported a full architectural ruin model with over 200,000 triangles into a single part. The PC version ran fine, but phone users complained about stuttering during load and while moving near the structure. I split it into separate parts by logical section—walls, floors, debris—and the problem disappeared almost entirely. You should also be aware that Roblox caches imported meshes per-user after the first download. If you iterate on a mesh frequently during development, the cache can sometimes serve stale versions to your local playtest until you force a republish or clear your local cache manually. That is annoying more often than not. The workaround is to give each updated mesh a unique name before republishing, which forces a fresh download rather than pulling from cache.
Where the Pipeline Breaks
Not every asset type imports cleanly. Skeletal animation rigs with complex bone hierarchies sometimes lose bone weight mapping if the original rig uses custom bone names that Roblox does not recognize. The result is a mesh that appears without animation or with incorrect pose binding. The safest workflow for animation is to export a bind-pose mesh separately from the animated clips, verify it looks correct first, and then layer the animation files on top in Studio's animation editor. Multi-material meshes with more than eight distinct surfaces can also cause texture bleeding inside Roblox. The engine caps the number of material channels per mesh in certain rendering paths. If your model uses ten different materials, some will merge or fall back to the default. The practical fix is to combine textures into a single atlas before exporting, so the mesh only carries one set of materials. It adds a step in Blender, but it prevents the visual artifacts that appear once the game runs on lower-end devices. If you need extremely high-detail organic shapes and the glTF route keeps giving you bad results, the alternative is to use regular BaseParts shaped manually inside Studio. It is slower to build, but it avoids the import pipeline entirely and gives you full control over collision, physics, and rendering behavior. I switched to that method for character bodies and environments where visual fidelity mattered more than speed.

A Few Practical Settings That Actually Matter
After import, check these properties on your new MeshPart:
- CastShadow: Set to false on decorative props that sit on the ground. Shadows from high-poly decorative geometry add unnecessary GPU cost.
- Anchored: Keep it false for physics objects, true for static scenery. Mixed settings cause weird collision bugs during testing.
- TopSurface / BottomSurface: Set these to Smooth or Weld instead of Plastic. It stops the edges from showing harsh material seams when parts touch.
- Resolution: You can adjust this after import via the Mesh property editor, but doing it during import is faster and preserves the original triangulation.
There is no single correct setting for every project. The import pipeline gives you enough control that the default values are close to usable, but they are not always the right values for a polished build. Experiment with the options for your first few imports and note what breaks. Once you know the breaking points, the process becomes routine.