Страница 1 из 1

Как получить NormalMap из террейна?

СообщениеДобавлено: 04 сен 2022, 15:02
Alkos26Rus
Кто знает как сгенерировать NormalMap текстуру из террейна? Именно нормалмеп самой сетки. Нужно для низкополигонального ландшафты, т.е будет использоваться сетка лоуполи, поэтому нужен NormalMap. Может кому то скрипт или ассет попадался который позволяет экспортировать карту нормалей? Гугл нечего не дал.

Re: Как получить NormalMap из террейна?

СообщениеДобавлено: 12 сен 2022, 11:22
jetyb
Синтаксис:
Используется csharp
    static Texture2D CreateNormalTexture(Terrain terrain) {
                var heightResolution = terrain.terrainData.heightmapResolution;
        var onePerWidth = 1f / (heightResolution - 1);

        var colors = new Color[heightResolution * heightResolution];
        for (int i = 0, num = 0; i < heightResolution; i++) {
            for (var j = 0; j < heightResolution; j++, num++) {
                var n = terrain.terrainData.GetInterpolatedNormal(i * onePerWidth, j * onePerWidth);
                colors[num] = new Color((n.x + 1f) * 0.5f, (n.y + 1f) * 0.5f, (n.z + 1f) * 0.5f);
            }
        }

        var texture = new Texture2D(heightResolution, heightResolution, TextureFormat.RGB24, false);
        texture.SetPixels(colors);
        texture.Apply();

        return texture;
    }
 

У меня тут правда тут сжатия и кодирования нет.

Re: Как получить NormalMap из террейна?

СообщениеДобавлено: 12 сен 2022, 12:58
Alkos26Rus
Спасибо большое, именно то что искал :-bd :-bd :-bd .

jetyb писал(а):У меня тут правда тут сжатия и кодирования нет.

Впринципе мне это не надо, я генерю текстуру из редактора, а там уже сжимаю как обычно. Только поменял в твоем коде местами зеленый и синий канал, так текстура становится коректной.

Вот готовый код с сохранением в папку.
Синтаксис:
Используется csharp
public Terrain terrain;

[ContextMenu("CreateNT")]
void CreateNT () {
SaveTexture(CreateNormalTexture(terrain), "/Data/Terrains/TerrainNormals", "TerrainNormalTest");
}


    static Texture2D CreateNormalTexture(Terrain terrain) {
        var heightResolution = terrain.terrainData.heightmapResolution;
        var onePerWidth = 1f / (heightResolution - 1);

        var colors = new Color[heightResolution * heightResolution];
        for (int i = 0, num = 0; i < heightResolution; i++) {
            for (var j = 0; j < heightResolution; j++, num++) {
                var n = terrain.terrainData.GetInterpolatedNormal(i * onePerWidth, j * onePerWidth);
                colors[num] = new Color((n.x + 1f) * 0.5f, (n.z + 1f) * 0.5f, (n.y + 1f) * 0.5f);
            }
        }

        var texture = new Texture2D(heightResolution, heightResolution, TextureFormat.RGB24, false);
        texture.SetPixels(colors);
        texture.Apply();

        return texture;
    }

 static void SaveTexture(Texture2D texture, string _path, string _name){
         byte[] bytes = texture.EncodeToPNG();
         var dirPath = Application.dataPath + _path;
         if (!System.IO.Directory.Exists(dirPath))
         {
             System.IO.Directory.CreateDirectory(dirPath);
         }
         System.IO.File.WriteAllBytes(dirPath + "/" + _name + ".png", bytes);
         Debug.Log(bytes.Length / 1024 + "Kb was saved as: " + dirPath);
 #if UNITY_EDITOR
         UnityEditor.AssetDatabase.Refresh();
 #endif
}