← Back to Blog 3d-modeling

Atlas Texture Packing for Game Props: Reduce Draw Calls and Texture Memory in Unity, Unreal Engine 5, and Godot 4

By BitSoul Team6/7/2026Updated 8/1/20266 min read57 views
Atlas Texture Packing for Game Props: Reduce Draw Calls and Texture Memory in Unity, Unreal Engine 5, and Godot 4

Every extra material slot on a game prop costs you a draw call. Multiply that across hundreds of props in a scene and you're watching your frame rate disappear in real time. Texture atlasing — packing multiple textures onto a single image sheet — is one of the oldest and most effective tricks in game optimization. Done correctly, it can cut draw calls by 80%, halve texture memory, and make your assets behave better on both mobile and console targets.

What Is Texture Atlasing and Why It Matters for Game Performance

A texture atlas is a single large texture image (typically 2048×2048 or 4096×4096 pixels) that contains the UV maps of multiple objects packed together. Instead of sending separate draw calls for each material, the GPU processes one texture with one draw call, regardless of how many distinct props share it.

The performance impact is concrete. On Unity, each additional material on a renderer adds a draw call. A scene with 200 props each using 3 materials = 600 draw calls before shadows or post-processing. Pack those same props onto a shared atlas and you can collapse that to 1–5 draw calls, depending on how many atlas sheets you need.

GPU memory also shrinks because texture compression works more efficiently on a single large image than on many small ones. A 256×256 texture uses more memory proportionally than the same content packed into a corner of a 2048×2048 atlas, because of fixed per-texture metadata overhead and mipmap chain inefficiency.

Atlasing is especially critical on mobile (draw call budgets of 100–300 per frame), VR (stereo rendering doubles all draw call costs), and open-world scenes with hundreds of unique instanced props.

Building a Texture Atlas in Blender: UV Layout and Packing Workflow

The Blender workflow for atlasing starts before you bake any textures. The goal is to get every prop's UV islands onto one shared UV space.

Step 1: Select all props, enter Edit Mode, then open the UV Editor. With all objects selected (Tab → A), open the UV editor and run UV → Pack Islands (shortcut: `Ctrl+P`). This auto-packs all UV islands into the 0–1 UV space. Set the Margin value to 0.003–0.005 to prevent texture bleed between islands.

Step 2: Scale islands by texel density. Not all props deserve equal UV real estate. A hero prop that fills the screen should have larger UV islands than background clutter. Use the Texel Density Checker add-on or manually scale islands with `S` in the UV editor.

Step 3: Bake to a new atlas image. Create a new 2048×2048 or 4096×4096 image in the UV editor. In the Render Properties → Bake panel:

```python
# Blender Python: set up bake target
import bpy

# Create atlas texture
bpy.ops.image.new(name='PropAtlas', width=2048, height=2048)

# For each object, assign the atlas image node
for obj in bpy.context.selected_objects:
for mat in obj.data.materials:
if mat and mat.use_nodes:
nodes = mat.node_tree.nodes
img_node = nodes.new('ShaderNodeTexImage')
img_node.image = bpy.data.images['PropAtlas']
nodes.active = img_node

# Bake
bpy.ops.object.bake(type='DIFFUSE')
```

Bake each channel separately: Diffuse/Albedo, Roughness, Metallic, Normal. You'll end up with 4 atlas images total — one per PBR channel.

Building a Texture Atlas in Blender: UV Layout and Packing Workflow — illustrated

Step 4: Merge the objects (optional). In Blender, you can join all props with `Ctrl+J` after atlasing. In most pipelines, keep them as separate meshes but assign the same single atlas material to all of them — this is what actually collapses the draw calls.

| Atlas Size | Max Props (64px avg per prop) | File Size (BC7 compressed) |
|------------|-------------------------------|-----------------------------|
| 1024×1024 | ~16 props | ~512 KB |
| 2048×2048 | ~64 props | ~2 MB |
| 4096×4096 | ~256 props | ~8 MB |

For most indie projects, a 2048×2048 atlas sheet hits the sweet spot between coverage and memory cost.

Atlasing in Unity URP: Import Settings, Draw Call Reduction, and GPU Instancing

In Unity, draw call batching for 3D props requires a manual material-sharing approach. After exporting your GLB or FBX from Blender with the baked atlas textures:

  1. Import the textures with correct color space: albedo as Default (sRGB), normal map as Normal map, roughness/metallic as Linear (uncheck sRGB).
  2. Create a single URP Lit material and assign the atlas textures to the correct slots.
  3. Assign the same material instance to every prop mesh that shares the atlas. Unity batches draw calls only when meshes share the exact same material instance.
  4. Enable GPU Instancing on the material (checkbox in the material inspector). This allows Unity to render hundreds of identical prop instances in a single draw call.
  5. Verify with the Frame Debugger (Window → Analysis → Frame Debugger). Properly atlased and instanced props will appear as `DrawMeshInstanced` entries, grouped together.

```csharp
// Unity: verify draw call count at runtime (Development Build)
using UnityEngine;
using UnityEngine.Rendering;

public class DrawCallMonitor : MonoBehaviour {
void OnGUI() {
GUILayout.Label($"Batches: {UnityStats.batches}");
GUILayout.Label($"Draw Calls: {UnityStats.drawCalls}");
}
}
```

For static props, enable Static Batching in Player Settings — Unity merges static meshes at build time, regardless of vertex count, delivering the best possible draw call reduction with zero runtime cost.

Texture Atlas Workflow in Unreal Engine 5 and Godot 4

Both engines handle atlasing differently at the API level, but the Blender export workflow is identical — you bring in a single atlas image assigned to multiple meshes.

Unreal Engine 5: Draw call batching happens automatically for static meshes via Hierarchical Instanced Static Mesh (HISM) components. To maximize atlasing benefits: create a Material Instance from a master M_PropAtlas material (never assign master materials directly), enable Nanite on high-poly hero props for merged rendering, and use Merge Actor (Window → Developer Tools → Merge Actors) to combine atlas-sharing props into a single static mesh at editor time.

Godot 4: Use `MultiMeshInstance3D` for instanced props and assign the atlas material directly to the MultiMesh resource:

```gdscript
# Godot 4: assign shared atlas material to multiple meshes
var atlas_material = preload("res://materials/prop_atlas.tres")

for prop in get_tree().get_nodes_in_group("atlas_props"):
if prop is MeshInstance3D:
prop.set_surface_override_material(0, atlas_material)

# For mass instancing (grass, rocks, debris)
var mm = MultiMesh.new()
mm.mesh = preload("res://meshes/rock_prop.tres")
$MultiMeshInstance3D.multimesh = mm
$MultiMeshInstance3D.material_override = atlas_material
```

`MultiMeshInstance3D` renders thousands of prop instances in a single draw call and accepts the atlas material directly, making it the go-to tool for open-world scatter objects.

Texture Atlas Workflow in Unreal Engine 5 and Godot 4 — illustrated

Common Atlasing Mistakes and How to Fix Them

Even experienced artists hit these issues when atlasing for the first time:

UV island bleeding. When mipmaps are generated, texels at island edges bleed into neighboring islands. Fix: add at least 4–8px of padding between islands (Margin 0.005+ in Blender's Pack Islands). For 4096×4096 atlases, use 8px minimum.

Oversized single atlas. Packing 200 props onto one 8192×8192 atlas sounds efficient, but many mobile GPUs cap at 4096×4096, and the entire texture loads even if only 2 props are visible. Split atlases by scene zone or prop category instead.

Mixing baked and procedural materials on the same mesh. A mesh with one atlas material and one Principled BSDF still costs 2 draw calls. Bake everything, or ensure the procedural material is a separate mesh that batches independently.

Ignoring texel density. If a small background rock gets the same UV space as a hero chest, the chest looks blurry and the rock wastes pixels. Allocate UV space proportionally to screen-space coverage at typical viewing distance.

Atlas Workflow Checklist

Get Atlas-Ready Assets from the BitSoul Marketplace

Building an atlas from scratch takes time. If you want to skip straight to the optimization stage, the BitSoul marketplace hosts hundreds of GLB and FBX props that come pre-UV'd and organized for easy atlas packing — grouped by environment theme so related assets already share compatible UV density.

Whether you're building a dungeon kit, a sci-fi facility, or an outdoor environment, browse BitSoul marketplace to find cohesive asset packs designed to be combined and atlased into production-ready prop sets.

Tags: texture atlas draw calls blender unity unreal engine 5 godot 4 game optimization pbr workflow

Skip the modelling — download it instead

A free BitSoul account gets you 2 game-ready models every month plus 25 AI Engine credits to generate one of your own, no card required. Clean topology, PBR textures, and GLB downloads that drop straight into Unreal, Unity, Godot or Blender — plus OBJ and 3D-printable STL export.

Create a free account → Browse 846 models