Вопрос о преимуществах использования субмешей

Общие вопросы о Unity3D

Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 05:02

Всем привет.
Задался таким вопросом, а в чем собственно преимущества использования субмешей перед несколькими полноценными мешами ?
Все вершины меша дублируются кратно количеству субмешей. Гемор с распределением треугольников (который в принципе можно распределять и по обычным мешам). Каждый субмеш все равно обсчитывается за отдельный DrawCall.

Единственное преимущество, это то что компоненты меша в одном объекте и все ?

Да и на счет дублирования всех вершин, может я что то неверно делаю и они дублироваться не должны, ведь используется один массив :-?? ?
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение MF_Andreich 06 апр 2015, 08:37

Дублирование это странно. Покажи как делаешь сабмеши.
Про плюсы... хз если честно. Созданы они явно для поддержки сложных мешей из 3d редакторов и поддержки разных материалов на одной модели. Для травы наверное особого смысла юзать именно сабмеш нет.
Holly Shovel Team
Аватара пользователя
MF_Andreich
Старожил
 
Сообщения: 924
Зарегистрирован: 20 июн 2013, 10:09
Откуда: Барнаул
Skype: mf_andreich
  • ICQ

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 08:42

Дублирование это странно. Покажи как делаешь сабмеши.


Стандартно. Вершины, развертка общие, треугольники закидываю по субмешам.
Но при этом он дублирует все вершины по количеству субмешей.
Синтаксис:
Используется csharp

        visualMesh.vertices = verts;

        if (tris.Length == 1){ visualMesh.triangles = tris[0]; }
        else
        {
            visualMesh.subMeshCount = tris.Length;
            for (int i = 0; i < visualMesh.subMeshCount; i++){ visualMesh.SetTriangles(tris[i], i); }
        }

        if (uvs != null) visualMesh.uv = uvs;

 


Про плюсы... хз если честно. Созданы они явно для поддержки сложных мешей из 3d редакторов и поддержки разных материалов на одной модели. Для травы наверное особого смысла юзать именно сабмеш нет.


Почему же нет смысла. Трава имеет одинаковую структуру - плашка. Эта плашка может текстурится разной травой. Смысл на каждую плашку создавать объект, если можно 1000 их запихнуть в один меш, но с кучей материалов.
Даже если не плашка, можно процедурно генерить свою геометрию под каждый тип травы, но пихать все в один меш.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение MF_Andreich 06 апр 2015, 09:34

Странно на самом деле, должно по идее работать, но я таки не понимаю, с какой целью ты выделяешь каждый треугольник в отдельный меш?
Holly Shovel Team
Аватара пользователя
MF_Andreich
Старожил
 
Сообщения: 924
Зарегистрирован: 20 июн 2013, 10:09
Откуда: Барнаул
Skype: mf_andreich
  • ICQ

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 09:52

MF_Andreich писал(а):Странно на самом деле, должно по идее работать, но я таки не понимаю, с какой целью ты выделяешь каждый треугольник в отдельный меш?


Да почему же каждый треугольник :D. tris - это список списков треугольников List<List<int>>. В нем записаны треугольники по количестую субмешей.

Вообщем я переделал под обычные меши траву - вершины выровнялись, теперь нужно в воксельном проекте переделать так же и будет норм :), а ночью буду внедрять траву в проект. Нахер эти субмеши - оказались бестолковой и к тому же еще и неэффективной штукой.

У меня кстати еще и DC уменьшились, что странно :-?.
Последний раз редактировалось bwolf88 06 апр 2015, 09:57, всего редактировалось 1 раз.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение jetyb 06 апр 2015, 09:55

У меня в меше 4 вершины, ищите ошибку
Синтаксис:
Используется csharp
        var m = new Mesh();
        m.vertices = new Vector3[]{new Vector3(), new Vector3(), new Vector3(), new Vector3() };
        m.triangles = new int[]{1,2,3};
        m.subMeshCount = 3;
        m.SetTriangles(new int[]{1,1,1}, 0);
        m.SetTriangles(new int[] { 1, 1, 1,2,2,2 }, 1);
        m.SetTriangles(new int[] { 1, 1, 1,2,2,2,3,3,3 }, 2);
        new GameObject().AddComponent<MeshFilter>().sharedMesh = m;
 


А так по мне иметь возможность двумя сабмешами ссылаться на одни и те же вершины не лишняя.
Плюс стандартный рендер и тени с AddPass сабмеши с одинаковыми материалами воспринимают по-разному.
Последний раз редактировалось jetyb 06 апр 2015, 10:04, всего редактировалось 1 раз.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 10:03

Вот функция, все эелементарно, где тут может быть ошибка ?

Синтаксис:
Используется csharp

public void CreateMesh(Vector3[] verts, int[][] tris, Vector2[] uvs)
    {
        if (verts == null) { ClearMesh(); return; }

        meshRenderer.enabled = true;

        visualMesh.Clear(); //очищаем меш, и сбрасываем количество субмешей
        visualMesh.vertices = verts; //присваиваем все вершины
        if (tris.Length == 1) { visualMesh.triangles = tris[0]; } //если массив треугольников один, то его и присваиваем мешу без создания субмешей
        else //если нет, создаем субмеши по количеству массивов треугольников
        {
            visualMesh.subMeshCount = tris.Length;
            for (int i = 0; i < visualMesh.subMeshCount; i++){ visualMesh.SetTriangles(tris[i], i); } //присваиваем каждому субмешу набор треугольников
        }
        visualMesh.uv = uvs; //присваиваем развертку
        visualMesh.RecalculateNormals(); //пересчитываем нормали

}
 


А так по мне иметь возможность двумя сабмешами ссылаться на одни и те же вершины не лишняя.
Плюс стандартный рендер и тени с AddPass сабмеши с одинаковыми материалами воспринимают по-разному.


Так то удобно и объектов меньше не спорю, но вот как то не вышло.
Плюс не у меня одного такая проблема была. Вот тут PAX писал тоже самое http://forum.boolean.name/showthread.php?t=17566

На счет рендера и теней не понял :).
Последний раз редактировалось bwolf88 06 апр 2015, 10:10, всего редактировалось 1 раз.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение Diab10 06 апр 2015, 10:09

Ну сабмеши помогают при объединении нескольких предметов с одним материалом, тогда DC будет один.
Можно наверно несколько объектов в один меш соединить, хз что будет лучше
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 10:11

Diab10 писал(а):Ну сабмеши помогают при объединении нескольких предметов с одним материалом, тогда DC будет один.
Можно наверно несколько объектов в один меш соединить, хз что будет лучше


А чем плох StaticBatchingUtility ? Так же можно создать парента к нужным объектам и объединить их, если у них один материал.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение jetyb 06 апр 2015, 10:54

Вообще ХЗ что тут у вас в коде может быть. У меня на своем тесте проблем нет. Тут же он не совсем корректен т.к. используется внешний объект visualMesh.
Вот навскидку:
1) Меш не создается, а используется имеющаяся. Может быть ее меняет какой-то скрипт или editor.
2) Меш правильно чистится? См перегрузку Mesh.Clear() - по умолчанию она все-таки что-то сохраняет
3) Mesh.RecalculateNormals не создает ли лишние нормали на каждую подмеш?
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 10:58

1) Меш не создается, а используется имеющаяся. Может быть ее меняет какой-то скрипт или editor.
2) Меш правильно чистится? См перегрузку Mesh.Clear() - по умолчанию она что-то сохраняет
3) Mesh.RecalculateNormals в случае сабмешей должна считать общие нормали или на каждую подмеш?


1. Меш никто не меняет, все выполняется только через управляющий скрипт в момент подачи команды только в PlayMode и больше никак. Никаких объектов до запуска кроме камеры и света на сцене нет.
2. Даже если что то сохраняет (а она не сохраняет), то при первичном построении меш чистый.
3. Я считаю общие нормали, но даже если закомментить эту строчку количество вершин не изменится.

visualMesh - это переменная типа Mesh. Он не сторонний, а является компонентом (Mesh) самого объекта.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение Diab10 06 апр 2015, 11:09

bwolf88 писал(а):
Diab10 писал(а):Ну сабмеши помогают при объединении нескольких предметов с одним материалом, тогда DC будет один.
Можно наверно несколько объектов в один меш соединить, хз что будет лучше


А чем плох StaticBatchingUtility ? Так же можно создать парента к нужным объектам и объединить их, если у них один материал.


Ну если я правильно помню, то эта штука кажется это и делает, делает из объектов сабмеши в один объект.

Ну это я всё из чтения форумов взял, т.к. сам ещё дел не имел с этим
Аватара пользователя
Diab10
Адепт
 
Сообщения: 3401
Зарегистрирован: 17 мар 2011, 20:42
Откуда: 123 RUS
Skype: diab1023

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 11:43

jetyb Я кажется знаю, почему у Вас вершины в "нормальном" количестве были. Вы на все субмеши использовали один материал. А попробуйте присвоить объекту 3 материала, и так же разбить треугольники. Скорей всего получите 12 вершин вместо 4.
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331

Re: Вопрос о преимуществах использования субмешей

Сообщение jetyb 06 апр 2015, 12:03

Да у меня все так же нормальное кол-во вершин. Меш же от материала не зависит. А вы как кол-во вершин смотрите? Я выделяю меш и смотрю в инспектор.
В статистике - да, помноженное число вершин должно быть. Они же обрабатываются разными материалами с разными вершинными шейдерами. Одну и ту же группу вершин преобразовывать же по-разному нельзя.
Значит надо каждому материалу свою выделенную группу вершин в видеопамять копировать.
jetyb
Адепт
 
Сообщения: 1486
Зарегистрирован: 31 окт 2011, 17:21

Re: Вопрос о преимуществах использования субмешей

Сообщение bwolf88 06 апр 2015, 19:42

Значит надо каждому материалу свою выделенную группу вершин в видеопамять копировать.


Ну тогда не пойдет такая конструкция. Смысл мне обрабатывать 3 млн вершин в субмешах, когда можно обработать 500к используя отдельные меши :).
Сюда периодически чего нибудь выкладываю https://github.com/LuchunPen
Аватара пользователя
bwolf88
Адепт
 
Сообщения: 2184
Зарегистрирован: 30 апр 2014, 06:40
Skype: bwolf331


Вернуться в Общие вопросы

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

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