LAC Texture Compressor
Complexity-based texture compression component
Texture Compressor analyzes avatar textures and compresses them based on their complexity. Complex textures (detailed patterns, text) receive less compression, while simple textures (solid colors, gradients) receive more compression.
Usage
Add the Component
- Select your avatar's root GameObject (the one with the VRC Avatar Descriptor)
- In the Inspector, click Add Component
- Navigate to Avatar Compressor > LAC Texture Compressor, or search for "Texture Compressor"
Build Your Avatar
Build your avatar normally through VRChat SDK. The component automatically:
- Analyzes all textures in your avatar
- Calculates compression level for each texture based on complexity
- Creates compressed copies (originals remain untouched)
- Updates materials to use compressed textures
Presets
Minimal compression for showcase avatars.
| Setting | Value |
|---|---|
| Divisor Range | 1x - 2x |
| Resolution Range | 256px - 2048px |
| Min Source Size | 1024px |
| Skip If Smaller Than | 512px |
Best for avatars where visual quality is the top priority.
Prioritizes visual quality while allowing moderate compression.
| Setting | Value |
|---|---|
| Divisor Range | 1x - 4x |
| Resolution Range | 128px - 2048px |
| Min Source Size | 512px |
| Skip If Smaller Than | 256px |
Good for PC avatars where you want to maintain quality but reduce some file size.
Good balance between quality and file size. (Recommended)
| Setting | Value |
|---|---|
| Divisor Range | 1x - 8x |
| Resolution Range | 64px - 2048px |
| Min Source Size | 256px |
| Skip If Smaller Than | 128px |
Recommended for most avatars. Provides significant file size reduction while maintaining good visual quality.
Strong compression for Quest avatars or limited VRAM.
| Setting | Value |
|---|---|
| Divisor Range | 2x - 8x |
| Resolution Range | 32px - 2048px |
| Min Source Size | 128px |
| Skip If Smaller Than | 64px |
Use this for Quest avatars or when you need to significantly reduce VRAM usage.
Maximum file size reduction.
| Setting | Value |
|---|---|
| Divisor Range | 4x - 16x |
| Resolution Range | 32px - 2048px |
| Min Source Size | 64px |
| Skip If Smaller Than | 32px |
Use this when file size is critical.
Full control over all settings.
When you select Custom, all settings become editable. You can also use Custom Preset Assets to save and reuse your settings. See Custom Presets and Advanced Settings below.
Built-in Custom Presets
In addition to the main presets above, intermediate presets are available via the Custom Preset dropdown:
| Preset | Position | Description |
|---|---|---|
| High Quality+ | Higher quality than High Quality | Maximum quality with minimal processing |
| Quality+ | Between High Quality and Quality | Higher quality than Quality, less compression |
| Balanced+ | Between Quality and Balanced | Higher quality than Balanced |
| Aggressive+ | Between Balanced and Aggressive | Higher quality than Aggressive |
| Maximum+ | Between Aggressive and Maximum | Higher quality than Maximum |
These presets provide finer control when the main presets don't quite match your needs.
Texture Filters
Control which texture types are processed:
| Filter | Description |
|---|---|
| Main Textures | Color/albedo textures (_MainTex, _BaseMap, etc.) |
| Normal Maps | Normal/bump maps (_BumpMap, _NormalMap, etc.) |
| Emission Maps | Emission textures (_EmissionMap, etc.) |
| Other Textures | Metallic, roughness, and other textures |
These flags are per-component settings and persist when switching presets.
Skip Uncompressed Textures on Unknown Properties
Available as a sub-option under Other Textures (enabled by default).
Some shaders use texture slots to store non-visual data — SPS bake data, masks, lookup tables — where individual pixel values matter. Compressing these textures can corrupt the data even when the visible result looks fine.
When this option is enabled, uncompressed textures assigned to unrecognized shader properties are skipped. Already-compressed textures (DXT/BC/ASTC) on the same properties are still processed, since their data is already lossy. Properties known by Unity Standard / URP / HDRP, lilToon, Poiyomi, and UTS2 are always treated as visual textures regardless of this setting.
Exclusions
The Exclusions section combines two ways to opt textures out of compression: by texture asset, and by asset path prefix.
Excluded Textures
Add specific Texture2D assets to skip them entirely. Useful when you want to keep a single texture untouched without converting it to a frozen entry.
- Expand the Exclusions section in the inspector
- Under Textures, click + Add Texture
- Drag a texture asset into the field, or pick one from the object picker
Excluded textures are matched by GUID, so renames and moves are tracked automatically.
Use Excluded Textures for "leave this exact texture alone." Use Frozen Textures when you still want compression but with different settings.
Path Exclusions
Skip every texture whose asset path starts with a given prefix. Useful for:
- Excluding temporary assets generated by other tools
- Preserving textures from specific packages that shouldn't be modified
The list is empty by default. Click + Add Path... to either enter a custom prefix or pick a known preset:
| Preset | Path |
|---|---|
| VRCFury Temp | Packages/com.vrcfury.temp/ |
Any texture whose asset path begins with a listed prefix is skipped.
Preview
Click Preview Compression Results in the Inspector to see compression analysis before building.
Search and Filter
The Frozen Textures and Preview sections each have their own search box, so you can filter the two lists independently:
- Standard search: Type any part of the texture name or asset path to filter the list (case-insensitive). The Preview search additionally matches the texture category (Main / Normal / Emission / Other). The Frozen search falls back to matching the texture GUID when the asset path can't be resolved.
- Fuzzy search: Toggle Fuzzy to allow up to 1 character of edit distance — insertion, deletion, or substitution.
While searching, the section header shows the filtered count (e.g., Frozen Textures (3/10) or Preview (3/10 shown)) and the search box itself shows Showing 3 of 10.
Summary
The preview shows total memory statistics for the avatar's textures:
| Metric | Description |
|---|---|
| Original | Total memory usage before compression |
| After | Estimated memory usage after compression |
| Savings | Percentage saved with absolute bytes (e.g., 40% (-1.5 MB)) |
Texture List
Entries are grouped under three section headers:
- Textures to Compress — entries that will be analyzed and compressed
- Frozen Textures (Manual Override) — entries with user-set Divisor / Format / Skip
- Skipped Textures — entries that won't be processed (see Skipped Textures)
For each texture, the preview displays:
- Texture thumbnail - Click to highlight the texture in the Project window
- Texture type label below the thumbnail (Main, Normal, Emission, Other)
- Texture name to the right of the thumbnail
- Complexity (0–100%) with a green-to-red progress bar
- Size -
{original}x{original} → {recommended}x{recommended} (÷N), or{original}x{original} (unchanged)when no resize is applied. - Format - Expected compression format (e.g., BC7, DXT5, ASTC_4x4) with format details (bpp, etc.)
- Freeze button - Click to freeze the texture with manual override settings (see Frozen Textures)
A Close Preview button at the bottom of the section dismisses the preview.
Clicking on a texture thumbnail is a quick way to locate and select the texture asset in your Project window.
Complexity Score Interpretation
| Score | Level | Compression |
|---|---|---|
| < 0.2 | Very Low | Heavy compression applied |
| 0.2 - 0.4 | Low | Suitable for compression |
| 0.4 - 0.6 | Medium | Moderate compression |
| 0.6 - 0.8 | High | Light compression only |
| ≥ 0.8 | Very High | Minimal compression |
Skipped Textures
Textures that won't be processed are shown separately with skip reasons:
- Too small: Texture is smaller than the minimum size threshold
- Filtered by type: Texture type is disabled in filters
- User frozen (skipped): Texture is frozen with "Skip compression" enabled
- Runtime generated: Texture has no asset path (dynamically created during build)
- Excluded texture: Texture is in the Excluded Textures list
- Excluded by path: Texture's asset path matches a path exclusion pattern
- Uncompressed on unknown property: Texture is uncompressed and assigned to an unrecognized shader property. See Skip Uncompressed Textures on Unknown Properties.
The preview does not update automatically. If settings change after generating a preview, a warning will appear prompting you to click the button again to refresh.
Frozen Textures
Frozen textures allow you to manually override compression settings for specific textures. This is useful when:
- Automatic compression is too aggressive for an important texture
- You want to preserve a specific texture at full quality
- You need to use a specific compression format for certain textures
Freezing a Texture
- Click Preview Compression Results to analyze your textures
- Find the texture you want to freeze in the list
- Click the Freeze button next to the texture
The texture will be moved to the "Frozen Textures" section with manual controls.
Frozen Texture Settings
For each frozen texture, you can configure:
| Setting | Description |
|---|---|
| Skip compression | When enabled, the texture is completely excluded from compression |
| Divisor | Manual resolution divisor (1, 2, 4, 8, or 16) |
| Format | Compression format override (Auto, DXT1, DXT5, BC5, BC7, ASTC_4x4/6x6/8x8) |
When Skip compression is enabled, the Divisor and Format settings are disabled since the texture won't be processed.
Available Formats
| Format | Description | Platform |
|---|---|---|
| Auto | Automatic format selection | All |
| DXT1 | RGB only, 4 bpp (efficient) | Desktop |
| DXT5 | RGBA, 8 bpp (with alpha) | Desktop |
| BC5 | Normal maps, 8 bpp | Desktop |
| BC7 | Highest quality, 8 bpp | Desktop |
| ASTC_4x4 | Mobile highest quality, 8 bpp | Mobile |
| ASTC_6x6 | Mobile balanced, 3.56 bpp | Mobile |
| ASTC_8x8 | Mobile efficient, 2 bpp | Mobile |
Unfreezing a Texture
To remove manual override and return to automatic compression:
- Find the texture in the Frozen Textures section
- Click the Unfreeze button
The texture will return to normal automatic processing.
If a frozen texture's asset file is moved or deleted, a warning will appear in the Frozen Textures section. You should unfreeze such textures to clean up the list.
Custom Presets
Custom Presets allow you to save compression settings as reusable ScriptableObject assets. This is useful for:
- Sharing settings across multiple avatars
- Creating platform-specific configurations (e.g., "PC/High Detail", "Quest/Optimized")
- Maintaining consistent compression settings across projects
Creating a Custom Preset
- Set the component to Custom mode
- Configure your desired settings
- Click the + button next to the preset field
- Choose a location and name for your new preset
The current settings will be saved to the new preset automatically.
Using a Custom Preset
- Set the component to Custom mode
- Click the Custom Preset button
- Select a preset from the hierarchical menu
Only presets with a Menu Path configured appear in the dropdown menu. Presets without a Menu Path can still be assigned by dragging them to the preset field.
Use-Only Mode vs Edit Mode
When you select a preset from the Custom Preset button, the component enters Use-Only Mode:
| Mode | Description |
|---|---|
| Use-Only | Settings are read-only, showing a summary of the preset |
| Edit Mode | Full access to modify settings (click Edit to switch) |
In Use-Only Mode:
- A settings summary shows the current configuration at a glance
- The preset's Description is displayed if set
- Click Edit to switch to Edit Mode for modifications
Preset Editing Restrictions
Some presets cannot be edited directly:
| Restriction Type | Icon | Description |
|---|---|---|
| Locked | 🔒 | User-locked preset (Lock field enabled) |
| Built-in | 🔒 | Bundled with Avatar Compressor package |
| External Package | 🔒 | From another package (e.g., a preset pack) |
When attempting to edit a restricted preset:
- A confirmation dialog appears
- You can choose to Unlink and continue editing (settings are copied locally)
- Or Cancel to keep the preset linked
Managing Preset Settings
These actions are available as icon buttons next to the preset field:
| Button | Action | Description |
|---|---|---|
| ↓ | Save | Save current settings to the linked preset (if editable) |
| ↩ | Discard | Reload settings from the preset, discarding local changes |
| + | Create | Create a new preset from current settings |
| ✕ | Unlink | Disconnect from preset while keeping current settings |
Hover over the icon buttons to see tooltips describing each action.
A sync indicator shows whether local settings match the preset:
- Modified: Local settings differ from the preset
- Synced: Settings match the linked preset
Preset Configuration
When editing a Custom Preset asset in the Inspector:
| Field | Description |
|---|---|
| Menu Path | Hierarchical path in dropdown (e.g., "PC/High Detail") |
| Menu Order | Display order in menu (lower values appear first, default: 1000) |
| Description | Optional description shown in Use-Only Mode |
| Lock | Prevent accidental modifications to this preset |
Advanced Settings
These settings are available when using the Custom preset.
Editor Preferences
Project-wide settings live under Edit > Preferences > Avatar Compressor. These apply to every avatar in the project.
| Setting | Default | Description |
|---|---|---|
| Enable Logging | On | Output debug logs during build and preview |
| Analysis Backend | Auto | Choose between Auto (GPU when available, otherwise CPU) and Software (CPU only) |
Analysis Backend
Texture complexity analysis can run on either the GPU (compute shaders) or the CPU. The GPU backend is faster on large avatars but requires supportsComputeShaders and supportsAsyncGPUReadback. CPU and GPU produce matching scores within numerical tolerance.
| Backend | When it runs |
|---|---|
| Auto | Uses GPU when supported; falls back to CPU otherwise. |
| Software | Always uses CPU. Useful for debugging or unstable GPU drivers. |
If GPU initialization fails at runtime, Avatar Compressor logs a warning and transparently falls back to CPU for that build — there is no need to switch the preference manually.
Compatibility
Texture Compressor runs during the NDMF Optimizing phase, after Modular Avatar but before TexTransTool and Avatar Optimizer. This ensures proper integration with avatar setup tools while optimizing textures before final avatar optimization.