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

Программирование на Юнити.

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

Сообщение Alkos26Rus 04 сен 2022, 15:02

Кто знает как сгенерировать NormalMap текстуру из террейна? Именно нормалмеп самой сетки. Нужно для низкополигонального ландшафты, т.е будет использоваться сетка лоуполи, поэтому нужен NormalMap. Может кому то скрипт или ассет попадался который позволяет экспортировать карту нормалей? Гугл нечего не дал.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

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

Сообщение jetyb 12 сен 2022, 11:22

Синтаксис:
Используется 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;
    }
 

У меня тут правда тут сжатия и кодирования нет.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

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

Сообщение Alkos26Rus 12 сен 2022, 12:58

Спасибо большое, именно то что искал :-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
}
 
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1640
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 7