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 | 2x - 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 |
|---|---|
| Process Main Textures | Color/albedo textures (_MainTex, _BaseMap, etc.) |
| Process Normal Maps | Normal/bump maps (_BumpMap, _NormalMap, etc.) |
| Process Emission Maps | Emission textures (_EmissionMap, etc.) |
| Process Other Textures | Metallic, roughness, and other textures |
Path Exclusions
Textures from specific asset paths can be excluded from compression. This is useful for:
- Excluding textures from tools that generate temporary assets
- Preserving textures from specific packages that shouldn't be modified
By default, the following paths are excluded:
| Path | Description |
|---|---|
Packages/com.vrcfury.temp/ | VRCFury temp files |
You can add custom path prefixes in the component inspector under Path Exclusions. Any texture whose asset path starts with one of these prefixes will be skipped.
Preview
Click Preview Compression Results in the Inspector to see compression analysis before building.
Search and Filter
Use the search box at the top of the preview to filter textures by name:
- Standard search: Type any part of the texture name to filter the list (case-insensitive)
- Fuzzy search: Click the "Fuzzy" button to enable fuzzy matching, which allows up to 1 character tolerance for typos
When searching, the section headers show filtered counts (e.g., "Preview (3/10 shown)") and hidden texture counts.
Summary
The preview shows total size statistics:
| Metric | Description |
|---|---|
| Original | Total uncompressed size of all textures |
| After | Estimated size after compression |
| Savings | Percentage and bytes saved |
| Memory (Est) | Estimated VRAM usage after compression |
Texture List
For each texture, the preview displays:
- Texture thumbnail - Click to highlight the texture in the Project window
- Texture name and type (Main, Normal, Emission, Other)
- Complexity score (0.0 - 1.0) with visual progress bar
- Size change - Original resolution → Recommended resolution (with divisor)
- Predicted format - Expected compression format (e.g., BC7, DXT5, ASTC_4x4)
- Freeze button - Click to freeze the texture with manual override settings (see Frozen Textures)
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 path: Texture's asset path matches a path exclusion pattern
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) |
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.
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.