forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Unity (http://forum.boolean.name/forumdisplay.php?f=144)
-   -   Как рендерить в Editor скриптах (http://forum.boolean.name/showthread.php?t=20535)

Evgen 17.01.2017 11:30

Как рендерить в Editor скриптах
 
Генерация 2д иконок.
Сделать в Coustom menu кнопку при нажатии которой будет генерироваться набор Png "скриношотов" 3д моделей.
Вопрос как рендерить в Editor скриптах? Нужно создавать временную с цену с камерой, потом renderToTexture и удалить сцену.

pax 17.01.2017 11:52

Ответ: Как рендерить в Editor скриптах
 
Вполне нормальное решение...
Можно наверное не делать новые сцены, а взять например не используемый слой (например 31) и запихнуть в него объект, а камере выставить cullingMask на этот слой.

Evgen 17.01.2017 13:19

Ответ: Как рендерить в Editor скриптах
 
Думаю использовать Application.CaptureScreenshot.
Как можно изменить разрешение окна Game?
Ничего не нашел.

Код:

public class Generate2DIcons : ScriptableObject
{
        [MenuItem ("Custom/Generate2DIcons")]
        static void Generate()
        {
                //Texture2D tex;
                EditorApplication.NewScene();
                UnityEditor.SceneView.currentDrawingSceneView.maxSize = new Vector2(64f, 64f);
                Application.CaptureScreenshot("icon.png");
        }
}


ARA 17.01.2017 13:41

Ответ: Как рендерить в Editor скриптах
 
Тута ручками можно

Nex 17.01.2017 13:52

Ответ: Как рендерить в Editor скриптах
 
Цитата:

Сообщение от Evgen (Сообщение 311407)
Думаю использовать Application.CaptureScreenshot.
Как можно изменить разрешение окна Game?
Ничего не нашел.

Код:

public class Generate2DIcons : ScriptableObject
{
        [MenuItem ("Custom/Generate2DIcons")]
        static void Generate()
        {
                //Texture2D tex;
                EditorApplication.NewScene();
                UnityEditor.SceneView.currentDrawingSceneView.maxSize = new Vector2(64f, 64f);
                Application.CaptureScreenshot("icon.png");
        }
}


1) Скриншот медленнее чем renderToTexture.
2) Зачем морока с обрезанием текстуры? Используй как написали выше отдельную камеру. Сразу отрендеришь в текстуру нужного разрешения.
Еще может быть поможет инфа, что у отдельной камеры можно поставить ортографическую проекцию и изменить размер (size).

Evgen 17.01.2017 14:24

Ответ: Как рендерить в Editor скриптах
 
Цитата:

Сообщение от ARA (Сообщение 311411)
Тута ручками можно

У нас тут 21 век, автоматизация понимаешь! :)

Evgen 17.01.2017 14:53

Ответ: Как рендерить в Editor скриптах
 
Цитата:

Сообщение от Nex (Сообщение 311413)
1) Скриншот медленнее чем renderToTexture.

Откуда инфа на счет скорости?
Код вырос и какой-то треш, в картинку попадает область вне рендера.

Код:

public class Generate2DIcons : ScriptableObject
{
        [MenuItem ("Custom/Generate2DIcons")]
        static void Generate()
        {
                int sqr = 256;
                RenderTexture rtex = new RenderTexture(sqr,sqr,24);
                EditorApplication.NewScene();
                Camera.main.aspect = 1.0f;
                Camera.main.targetTexture = rtex;
                Camera.main.Render();
                RenderTexture.active = rtex;
                Texture2D tex = new Texture2D(sqr,sqr,TextureFormat.RGB24, false);
                tex.ReadPixels(new Rect(0, 0, sqr, sqr), 0, 0);
                tex.Apply();
                RenderTexture.active = null;
                Camera.main.targetTexture = null;
                byte[] bytes = tex.EncodeToPNG ();
                System.IO.File.WriteAllBytes(Application.dataPath + "/"+"icon.png",bytes);
                //Application.CaptureScreenshot("icon.png");
        }
}


Nex 17.01.2017 16:15

Ответ: Как рендерить в Editor скриптах
 
Цитата:

Сообщение от Evgen (Сообщение 311417)
Откуда инфа на счет скорости?

Делал запись видео из юнити в файл. При рендере в текстуру в цикле можно играть в игру, а при использовании скриншотов в игру уже проблемно поиграть.


Создаешь новый слой и назначаешь тем объектам, которые нужно рендерить. Слой это справа от "Tag".

Создаешь новую камеру для рендера. Ставишь clearFlags: SolidColor; Culling Mask: имя слоя, который ты создал и назначил объектам; Projection: подойдет вроде любой, но лучше поставить ортографический; Size: такой что бы все объекты попали в камеру, но при этом что бы меньше было пустоты по бокам (короч 1.2 подойдет). Еще у камеры можно в Background задать черный или яркозеленый цвет что бы потом обрезать фон (как сделать прозрачный фон хз).

Создаешь в редакторе (можно и в коде, но зачем?) RenderTexture и назначаешь её в TargerTexture у камеры, которая будет рендерить.
Вешаешь скрипт на рендер камеру, который ниже (можно и свой через элементы меню и прочее, но это уже сам переделывай).

?? Вроде всё ??
Запускаешь игру@смотришь картинку в папке.

Код:

using UnityEngine;

public class qwer : MonoBehaviour {
    void Start() {
        int sqr = 256;

        Camera camera = GetComponent<Camera>();
        RenderTexture renderTexture = camera.targetTexture;
        camera.Render();

        RenderTexture.active = renderTexture;

        Texture2D tex = new Texture2D(sqr, sqr, TextureFormat.RGB24, false);
        tex.ReadPixels(new Rect(0, 0, sqr, sqr), 0, 0);
        tex.Apply();

        byte[] bytes = tex.EncodeToPNG();
        System.IO.File.WriteAllBytes(Application.dataPath + "/" + "icon.png", bytes);
    }
}


Evgen 17.01.2017 16:24

Ответ: Как рендерить в Editor скриптах
 
Цитата:

Сообщение от Nex (Сообщение 311421)
?? Вроде всё ??
Запускаешь игру@смотришь картинку в папке.

Не.. не.. не.. Давайте без костылей. Когда было мало опыта я тоже их применял. Мне нужна специальная кнопочка в редакторе - нажал и рисунки обновились. Очень удобно.

Собственно внизу код, результат вроде, как надо. Результат не зависит от размера Game окна. Что я собственно не мог побороть в начале.

Код:

public class Generate2DIcons : ScriptableObject
{
        [MenuItem ("Custom/Generate2DIcons")]
        static void Generate(){
                EditorWindow.focusedWindow.maxSize = new Vector2 (10, 10);

                // Создаем сцену
                EditorApplication.NewScene();

                GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
                cube.transform.position = new Vector3(0, 1, -7);
                cube.transform.rotation = Quaternion.Euler(45,45,0);
                SaveScreenshoot("cube.png");
                DestroyImmediate(cube);

                Debug.Log("Ok");
        }

        static void SaveScreenshoot(string name){
                // Делаем скриншот
                int sqr = 256;
                RenderTexture rtex = new RenderTexture(sqr,sqr,24);
                Camera.main.targetTexture = rtex;
                Camera.main.Render();
                RenderTexture.active = rtex;
                Texture2D tex = new Texture2D(sqr,sqr,TextureFormat.RGB24, false);
                tex.ReadPixels(new Rect(0, 0, sqr, sqr), 0, 0);
                tex.Apply();
                RenderTexture.active = null;
                Camera.main.targetTexture = null;
                byte[] bytes = tex.EncodeToPNG ();
                System.IO.File.WriteAllBytes(Application.dataPath + "/"+name,bytes);
        }
}

Не знаю для чего здесь нужно вот это:
EditorWindow.focusedWindow.maxSize = new Vector2 (10, 10);
но вроде нужно.

Nex 17.01.2017 16:31

Ответ: Как рендерить в Editor скриптах
 
Ты как раз костылей наделал.
Что будет если окно не в фокусе?
Для чего новая сцена???
Кнопочка в редакторе дело вкуса, принцип не меняется.

Фикс:
Что бы был прозрачный фон нужно:
Поставить у камеры, которая рендерит ClearFlags: DepthOnly и заменить строку в коде:
Цитата:

Texture2D tex = new Texture2D(sqr, sqr, TextureFormat.RGB24, false);
на
Цитата:

Texture2D tex = new Texture2D(sqr, sqr, TextureFormat.ARGB32, false);

Еще хотел возразить насчет того, что твой код гуглиться по первой ссылке при запросе "unity3d render texture to file".
Так собственно зачем спрашивать совета на форуме когда ты в конечном итоге взял готовый стремный код из гугла и доволен?

Evgen 17.01.2017 17:22

Ответ: Как рендерить в Editor скриптах
 
Цитата:

Сообщение от Nex (Сообщение 311423)
Ты как раз костылей наделал.
Что будет если окно не в фокусе?

Пока не сталкивался. Все работает. Как можно этот "баг" симулировать?

Цитата:

Сообщение от Nex (Сообщение 311423)
Для чего новая сцена???

Чтобы не разрушать текущую открытую сцену, создается временная новая.

Цитата:

Сообщение от Nex (Сообщение 311423)
Кнопочка в редакторе дело вкуса, принцип не меняется.

Нет задумывалось именно средствами редактора. Делаешь проект, добавил новые 3D элементы. Нажал кнопку в редакторе обновил общий атлас иконок. Далее запустил проект проверил как отрисовалось GUI.

Цитата:

Сообщение от Nex (Сообщение 311423)
Фикс:
Что бы был прозрачный фон нужно:
Поставить у камеры, которая рендерит ClearFlags: DepthOnly и заменить строку в коде:...

Не уверен, что это так просто реализуемо... Кстати RenderTexture вроде не поддерживает альфа канал.

Цитата:

Сообщение от Nex (Сообщение 311423)
Еще хотел возразить насчет того, что твой код гуглиться по первой ссылке при запросе "unity3d render texture to file".
Так собственно зачем спрашивать совета на форуме когда ты в конечном итоге взял готовый стремный код из гугла и доволен?

Похожий код из гугла != готовый != рабочий. Код составлен из разных фрагментов. Если нет ответа, приходится гуглить и это нормально. Код вполне красивый, но нужно еще немного доработать.


Часовой пояс GMT +4, время: 18:16.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot