unity runtime_error ai_generated true

ArgumentException: TerrainData.SetAlphamaps - alphamap resolution does not match terrain data

ID: unity/terrain-alphamap-resolution-mismatch

Also available as: JSON · Markdown · 中文
90%Fix Rate
84%Confidence
1Evidence
2023-09-20First Seen

Version Compatibility

VersionStatusIntroducedDeprecatedNotes
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.html

Workarounds

  1. 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.
  2. 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.
  3. 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.

中文步骤

  1. 在调用SetAlphamaps之前,确保float数组维度与地形的透明度贴图分辨率匹配:int width = terrainData.alphamapWidth; int height = terrainData.alphamapHeight; int layers = terrainData.alphamapLayers; float[,,] alphamaps = new float[height, width, layers]; 然后填充并赋值。
  2. 如果使用纹理作为源,先读取其像素到2D数组,使用双线性插值重新采样到正确分辨率,然后再转换为3D float数组。
  3. 使用terrainData.GetAlphamaps(0, 0, width, height)获取当前的透明度贴图,仅修改必要的单元格,然后使用相同维度调用SetAlphamaps。

Dead Ends

Common approaches that don't work:

  1. 95% fail

    SetAlphamaps expects a 3D float array (float[,,]), not a Texture2D. Resizing a texture does not convert it to the correct data format.

  2. 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.

  3. 90% fail

    The error prevents alphamap updates, so terrain texturing will be incomplete or incorrect, leading to visual bugs.