LAC: Avatar Compressor
Components

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.

Full View

Usage

Add the Component

  1. Select your avatar's root GameObject (the one with the VRC Avatar Descriptor)
  2. In the Inspector, click Add Component
  3. Navigate to Avatar Compressor > LAC Texture Compressor, or search for "Texture Compressor"

Select a Preset

Choose a preset that matches your needs.

Balanced is recommended for most avatars.

Build Your Avatar

Build your avatar normally through VRChat SDK. The component automatically:

  1. Analyzes all textures in your avatar
  2. Calculates compression level for each texture based on complexity
  3. Creates compressed copies (originals remain untouched)
  4. Updates materials to use compressed textures

Presets

Minimal compression for showcase avatars.

SettingValue
Divisor Range1x - 2x
Resolution Range256px - 2048px
Min Source Size1024px
Skip If Smaller Than512px

Best for avatars where visual quality is the top priority.

Prioritizes visual quality while allowing moderate compression.

SettingValue
Divisor Range1x - 4x
Resolution Range128px - 2048px
Min Source Size512px
Skip If Smaller Than256px

Good for PC avatars where you want to maintain quality but reduce some file size.

Good balance between quality and file size. (Recommended)

SettingValue
Divisor Range1x - 8x
Resolution Range64px - 2048px
Min Source Size256px
Skip If Smaller Than128px

Recommended for most avatars. Provides significant file size reduction while maintaining good visual quality.

Strong compression for Quest avatars or limited VRAM.

SettingValue
Divisor Range2x - 8x
Resolution Range32px - 2048px
Min Source Size128px
Skip If Smaller Than64px

Use this for Quest avatars or when you need to significantly reduce VRAM usage.

Maximum file size reduction.

SettingValue
Divisor Range4x - 16x
Resolution Range32px - 2048px
Min Source Size64px
Skip If Smaller Than32px
This preset may noticeably affect visual quality.

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:

PresetPositionDescription
High Quality+Higher quality than High QualityMaximum quality with minimal processing
Quality+Between High Quality and QualityHigher quality than Quality, less compression
Balanced+Between Quality and BalancedHigher quality than Balanced
Aggressive+Between Balanced and AggressiveHigher quality than Aggressive
Maximum+Between Aggressive and MaximumHigher 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:

FilterDescription
Main TexturesColor/albedo textures (_MainTex, _BaseMap, etc.)
Normal MapsNormal/bump maps (_BumpMap, _NormalMap, etc.)
Emission MapsEmission textures (_EmissionMap, etc.)
Other TexturesMetallic, 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.

  1. Expand the Exclusions section in the inspector
  2. Under Textures, click + Add Texture
  3. 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:

PresetPath
VRCFury TempPackages/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:

MetricDescription
OriginalTotal memory usage before compression
AfterEstimated memory usage after compression
SavingsPercentage 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

ScoreLevelCompression
< 0.2Very LowHeavy compression applied
0.2 - 0.4LowSuitable for compression
0.4 - 0.6MediumModerate compression
0.6 - 0.8HighLight compression only
≥ 0.8Very HighMinimal 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

  1. Click Preview Compression Results to analyze your textures
  2. Find the texture you want to freeze in the list
  3. 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:

SettingDescription
Skip compressionWhen enabled, the texture is completely excluded from compression
DivisorManual resolution divisor (1, 2, 4, 8, or 16)
FormatCompression 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

FormatDescriptionPlatform
AutoAutomatic format selectionAll
DXT1RGB only, 4 bpp (efficient)Desktop
DXT5RGBA, 8 bpp (with alpha)Desktop
BC5Normal maps, 8 bppDesktop
BC7Highest quality, 8 bppDesktop
ASTC_4x4Mobile highest quality, 8 bppMobile
ASTC_6x6Mobile balanced, 3.56 bppMobile
ASTC_8x8Mobile efficient, 2 bppMobile

Unfreezing a Texture

To remove manual override and return to automatic compression:

  1. Find the texture in the Frozen Textures section
  2. 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

  1. Set the component to Custom mode
  2. Configure your desired settings
  3. Click the + button next to the preset field
  4. Choose a location and name for your new preset

The current settings will be saved to the new preset automatically.

Using a Custom Preset

  1. Set the component to Custom mode
  2. Click the Custom Preset button
  3. 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:

ModeDescription
Use-OnlySettings are read-only, showing a summary of the preset
Edit ModeFull 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 TypeIconDescription
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:

  1. A confirmation dialog appears
  2. You can choose to Unlink and continue editing (settings are copied locally)
  3. Or Cancel to keep the preset linked

Managing Preset Settings

These actions are available as icon buttons next to the preset field:

ButtonActionDescription
SaveSave current settings to the linked preset (if editable)
DiscardReload settings from the preset, discarding local changes
+CreateCreate a new preset from current settings
UnlinkDisconnect 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:

FieldDescription
Menu PathHierarchical path in dropdown (e.g., "PC/High Detail")
Menu OrderDisplay order in menu (lower values appear first, default: 1000)
DescriptionOptional description shown in Use-Only Mode
LockPrevent 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.

SettingDefaultDescription
Enable LoggingOnOutput debug logs during build and preview
Analysis BackendAutoChoose 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.

BackendWhen it runs
AutoUses GPU when supported; falls back to CPU otherwise.
SoftwareAlways 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.

On this page