Bakes terrain layers Occlusion maps into one Basemap texture.
Occlusion map is calculated from Mask map's green channel. If terrain layers don't use Mask maps, then Occlusion map also cannot be baked.
By default TerrainData object doesn't use Height Based Blend feature. This is optional feature for the terrain material and if converted terrain uses it, it needs to be manually set inside ExportBasemapOcclusionTexture method:
Material's height based blend values can be read using Terrain.GetMaterialHeightBasedBlendValues method.
Texture2D[] ExportBasemapOcclusionTexture(int resolution, int splitCountHorizontal, int splitCountVertical, bool enableHeightBasedBlend = false, float heightTransition = 0)
Splits terrain into 2D grid by splitCountHorizontal and splitCountVertical amount and for each chunk calculates BasemapOcclusion texture.
This method can be used in combination with multi-chunk mesh exporter, in this case index of a mesh in 2D grid array and Basemap texture's are the same.
//Example of generating multi-chunk meshes (8x8 grid) with UVs per chunk and
//exporting Basemap Diffuse and Occlusion textures for each one.
bool calculateUVsPerChunck = true;
int vertexCount = 100;
int textureResolution = 2048;
int splitCountHorizontal = 8;
int splitCountVertical = 8;
Mesh[] meshes = terrainData.TerrainToMesh().ExportMesh(vertexCount, vertexCount, splitCountHorizontal, splitCountVertical, calculateUVsPerChunck);
Texture2D[] diffuseMaps = terrainData.TerrainToMesh().ExportBasemapDiffuseTexture(textureResolution, false, splitCountHorizontal, splitCountVertical);
Texture2D[] occlusionMaps = terrainData.TerrainToMesh().ExportBasemapOcclusionTexture(textureResolution, splitCountHorizontal, splitCountVertical);
for(int i = 0; i < meshes.Length; i++)
{
GameObject go = new GameObject();
//Assign generated terrain mesh
go.AddComponent<MeshFilter>().sharedMesh = meshes[i];
//Creating material using default shader
Material material = new Material(TerrainToMeshUtilities.GetDefaultShader());
//Setting up material to use diffuse and occlusion maps
TerrainToMeshUtilities.SetupDefaultMaterial(material, diffuseMaps[i], false, null, null, occlusionMaps[i]);
//Assign material
go.AddComponent<MeshRenderer>().sharedMaterial = material;
}
ExportBasemapOcclusionTexture(int resolution, int splitCountHorizontal, int splitCountVertical, int splitColumnIndex, int splitRowIndex, bool enableHeightBasedBlend = false, float heightTransition = 0)
Splits terrain into 2D grid by splitCountHorizontal and splitCountVertical amount and calculates BasemapOcclusion texture for chunk with index splitColumnIndex and splitRowIndex.