ArgumentException: TerrainData.SetAlphamaps - alphamap resolution does not match terrain data
ID: unity/terrain-alphamap-resolution-mismatch
Version Compatibility
| Version | Status | Introduced | Deprecated | Notes |
|---|---|---|---|---|
| Unity 2021.3 | active | — | — | — |
| Unity 2022.3 | active | — | — | — |
| Unity 2023.1 | active | — | — | — |
Root Cause
The alphamap (splatmap) texture passed to TerrainData.SetAlphamaps has a resolution that does not match the terrain's configured alphamap resolution (width and height), causing an array dimension mismatch.
generic中文
传递给TerrainData.SetAlphamaps的透明度贴图(混合贴图)纹理的分辨率与地形配置的透明度贴图分辨率(宽度和高度)不匹配,导致数组维度不一致。
Official Documentation
https://docs.unity3d.com/ScriptReference/TerrainData.SetAlphamaps.htmlWorkarounds
-
95% success Before calling SetAlphamaps, ensure the float array dimensions match the terrain's alphamap resolution: int width = terrainData.alphamapWidth; int height = terrainData.alphamapHeight; int layers = terrainData.alphamapLayers; float[,,] alphamaps = new float[height, width, layers]; Then populate and assign.
Before calling SetAlphamaps, ensure the float array dimensions match the terrain's alphamap resolution: int width = terrainData.alphamapWidth; int height = terrainData.alphamapHeight; int layers = terrainData.alphamapLayers; float[,,] alphamaps = new float[height, width, layers]; Then populate and assign.
-
85% success If using a texture as source, read its pixels into a 2D array and resample to the correct resolution using bilinear interpolation before converting to a 3D float array.
If using a texture as source, read its pixels into a 2D array and resample to the correct resolution using bilinear interpolation before converting to a 3D float array.
-
90% success Use terrainData.GetAlphamaps(0, 0, width, height) to retrieve the current alphamaps, modify only the necessary cells, and then call SetAlphamaps with the same dimensions.
Use terrainData.GetAlphamaps(0, 0, width, height) to retrieve the current alphamaps, modify only the necessary cells, and then call SetAlphamaps with the same dimensions.
中文步骤
在调用SetAlphamaps之前,确保float数组维度与地形的透明度贴图分辨率匹配:int width = terrainData.alphamapWidth; int height = terrainData.alphamapHeight; int layers = terrainData.alphamapLayers; float[,,] alphamaps = new float[height, width, layers]; 然后填充并赋值。
如果使用纹理作为源,先读取其像素到2D数组,使用双线性插值重新采样到正确分辨率,然后再转换为3D float数组。
使用terrainData.GetAlphamaps(0, 0, width, height)获取当前的透明度贴图,仅修改必要的单元格,然后使用相同维度调用SetAlphamaps。
Dead Ends
Common approaches that don't work:
-
95% fail
SetAlphamaps expects a 3D float array (float[,,]), not a Texture2D. Resizing a texture does not convert it to the correct data format.
-
60% fail
While this can work, it alters the terrain's base settings and may affect performance or other scripts that depend on the original resolution.
-
90% fail
The error prevents alphamap updates, so terrain texturing will be incomplete or incorrect, leading to visual bugs.