Допустим есть 3d модель. При нажатии на кнопку (кнопка в данном случае - кнопка изменения параметров (меню настроек), для оптимизации на неподходящих для работы компьютеров) нужно чтобы 3 материала распределялись по 3d модель по нужным мне параметрам. Один на одежду, другой на волосы, третий на тело. Что определяет эти параметры. Ведь по началу всё легко. Нанес текстуры в 3ds max, экспортировал в unity, в unity они окрасились в рандомные цвета и просто надо нужные мне материалы поставит на эти цвета. А что определяет эти параметры я так и не понял.
Сообщение отредактировал DantorS - Воскресенье, 09 Марта 2014, 14:40
Экспортировать модель, которая будет состоять из нескольких объектов. Дальше на каждый объект можно натянуть материал. Примерно так(писал по памяти)
Код
Material mat1 = Resources.Load("MyMaterial") as Material; transform.Find("Object").material = mat1;
В данном случае загрузим материал из ресурсов и присвоим дочернему объекту с именем Object. Аналогично и с другими объектами Это при условии, что скрипт висит на самом объекте.
Сообщение отредактировал Storm54 - Понедельник, 03 Марта 2014, 11:23
Есть способ шейдеры менять, в разных материалах на одном цельном объекте. Делал так, когда нужно было на анимированной модели скрывать руки/ноги и потом снова показывать. Делал так. Сперва нужно в редакторе моделей (использовал 3dmax) выделить одну группу полигонов (например ноги) - назначить им 1 материал, выделить другую группу полигонов (руки) - назначить другой материал, и т.д. Потом уже в таком виде экспортировать в FBX. В импортированной модели в инспекторе Unity мы должны увидеть в поле Materials - сразу несколько шариков материалов, если этого не произошло - что-то неправильно сделали в 3d-редакторе. Далее в коде пишем(JS):
Код
var mat : Material[]; //объявляем массив материалов var shaderInvisible : Shader = Shader.Find("Pat/VisibleBehindObjects"); //находим нужные шейдеры var diffuseShader : Shader = Shader.Find("Diffuse");
function Start () {
other = GameObject.Find("mesh"); //находим наш объект mat=other.renderer.materials; // наполняем наш массив материалами с выбранного объекта
}
function ChangeShader() {
//меняем шейдер материала такой функцией, обращемся к нужному материалу по порядковому номеру //можно в инспекторе посмотреть в каком порядке материалы на модели идут (например 1 - матриал ног, 2 - материал рук и т.д.) mat[17].shader = shaderInvisible; // или = diffuseShader; mat[18].shader = shaderInvisible; mat[19].shader = shaderInvisible;
Мне нужно чтобы статично был один материал на всю модель, а при нажатии на кнопку один материал на тело, другой на одежду, третий на волосы.
Storm54, твой вариант не подходит. Я же задал совсем другой вопрос. GantZ_Yaka, я уже в вопросе описал что твой вариант делается легко.
ЦитатаDantorS ()
Ведь по началу всё легко. Нанес текстуры в 3ds max, экспортировал в unity, в unity они окрасились в рандомные цвета и просто надо нужные мне материалы поставит на эти цвета. А что определяет эти параметры я так и не понял.
Но как сделать чтобы статично был один материал на всю, а при нажатии на кнопку они распределялись.
Добавлено (07.03.2014, 23:56) --------------------------------------------- Ну и почему все молчат? Кто-то же должен знать? Неужели по скрипту определить место фиксации полигонов сложно - кто-то же должен знать как?
Сообщение отредактировал DantorS - Понедельник, 03 Марта 2014, 18:25
Есть кнопка off/on. Если off накладываются 3 материала на модель (волосы,одежа,тело). Если on накладывается один материал на все. Не понятно что в unity (в скриптинге) отвечает за фиксацию полигонов (определние того, на какие полигоны нужно наносить материал)
Сообщение отредактировал DantorS - Суббота, 08 Марта 2014, 02:59
Потому что бред какой-то спрашиваешь. Что-то я вообще нигде не слышал о таком, что ты хочешь сделать. Определение наложения текстуры на модель определяется разверткой, и на одну модель мы вешаем либо пару текстур, либо одну. О промежуточном варианте (чтобы можно было вешать разное количество текстур) я не слышал.
И зачем вообще такие сложности нужны? Обязательно нужно делать отдельно три материала? Если да, то почему нельзя просто сделать отдельную текстуру на каждую часть, а при нажатии кнопки, просто назначать на все части одинаковую текстуру?
Добавлено (08.03.2014, 08:24) --------------------------------------------- Если охота ковырять это все из кода, копай в сторону класса Mesh (подозреваю, тебе придется оперировать с массивом UV координат) и понятия subMeshes.
Когда-то тут будут ссылки на крутые проекты. Или нет.
Потому что бред какой-то спрашиваешь. Что-то я вообще нигде не слышал о таком, что ты хочешь сделать. Определение наложения текстуры на модель определяется разверткой, и на одну модель мы вешаем либо пару текстур, либо одну. О промежуточном варианте (чтобы можно было вешать разное количество текстур) я не слышал.
Как ты думаешь: если слабый компьютер: ему с чем будет проще работать с 60 текстурами или с 600?
Если охота ковырять это все из кода, копай в сторону класса Mesh (подозреваю, тебе придется оперировать с массивом UV координат) и понятия subMeshes.
Спасибо, нашел. Но для того что мне нужно надо заполнять список треугольников вручную (брать координаты треуголбников, и заносить в эти координаты в список треугольников submesh-a). Нет способа проще. (это получится слишком долго). Или взять submesh (с 3 материалами) и оттуда вытащить этот список.
Как ты думаешь: если слабый компьютер: ему с чем будет проще работать с 60 текстурами или с 600?
То есть, ты хочешь делать один материал, если материал слишком слаб? Или отсекаешь варианты, в которых используется слишком много текстур? В любом случае, если хочешь хорошо оптимизировать игру, нужно четко понимать, что делать игру, которая пойдет на пятнадцатилетнем пентиуме, сейчас делать нет смысла. Да и методов для оптимизации и так есть много, и для них никаких костылей не нужно. И вообще, у тебя уже есть готовая игра, которую ты протестировал, и понял, что ее надо аж так сильно оптимизировать? Когда-то тут будут ссылки на крутые проекты. Или нет.
Оптимизация - это всегда хорошо. Например, я не могу очень многие игры после 2010 не могу запустить на своем ПК. И вообще оптимизации много не бывает. Так что с моим вопросом? Как вытащить список координат?
Так что с моим вопросом? Как вытащить список координат?
Модель в классе представлена массивом треугольников и вертексов. Массив треугольников, по сути, показывает, какие индексы массива вертексов формируют треугольник, то есть, этот массив всегда кратен числу 3. То есть, чтобы нарисовать обычный тетраэдр, нам необходим массив с четырьмя вертексами, и массив треугольников размером 12 - четыре комбинации, отвечающие за треугольники модели, по три вертекса каждая. Это так, лирическое отступление насчет организации модели, вдруг кому интересно.
А для нескольких субмешей, я так понял, используется все тот же общий массив вертексов, просто для каждого субмеша свой массив треугльников. Получить или назначить массив треугольников для субмеша достаточно функциями SetTriangles и GetTriangles. Ну и менять subMeshCount. Массив же UV координат на это не рассчитан. Приятного изобретения велосипеда. Когда-то тут будут ссылки на крутые проекты. Или нет.
А какая разница? Полигон меша соответствует uv полигону. Тоесть в uv сетке отражается каждый полигон mesh-a.
Факт остается фактом, в определении класса Mesh нет функционала для назначения UV координат на конкретный субмеш. То есть, тебе в любом случае надо будет использовать одну сетку uv координат на все субмешы. То есть, по сути, ты можешь сделать три субмеша, чтобы каждый из них использовал отдельный материал, однако, текстуры для этих материалов все равно должны иметь уникальные uv координаты. Когда-то тут будут ссылки на крутые проекты. Или нет.
Сообщение отредактировал lentinant - Суббота, 08 Марта 2014, 23:24
Факт остается фактом, в определении класса Mesh нет функционала для назначения UV координат на конкретный субмеш. То есть, тебе в любом случае надо будет использовать одну сетку uv координат на все субмешы. То есть, по сути, ты можешь сделать три субмеша, чтобы каждый из них использовал отдельный материал, однако, текстуры для этих материалов все равно должны иметь уникальные uv координаты.
Это как раз то что нужно. Нужно было 3 материала(3 шейдера(шейдер на волосы никак не подойдет на одежду)) нанести на модель. При переключении кнопки один материал накладывается на все.
Добавлено (08.03.2014, 23:37) --------------------------------------------- Аааа подожди я не понял.... Мне нужна одна развертка на всё или развртки разные (под одежду,тело,волосы)?
Добавлено (08.03.2014, 23:43) --------------------------------------------- Как я понял разные. Но это нереально потому что модель одна с одной разверткой. Тогда как же быть
Добавлено (08.03.2014, 23:44) Все понял, делать текстуры, но с разверткой на всю модель. Да?
Сообщение отредактировал DantorS - Суббота, 08 Марта 2014, 23:51
Как я понял разные. Но это нереально потому что модель одна с одной разверткой. Тогда как же быть
ЦитатаDantorS ()
Все понял, делать текстуры, но с разверткой на всю модель. Да?
Вроде того. Для создания текстуры для части модели, используешь только ту часть развертки, которая отвечает за соответствующую часть модели. Чтобы, если сложить текстуры для частей вместе, то получится одна текстура, без накладок. Кстати, если их и совмещать, и получать на выходе одну текстуру, можно сэкономить на окончательном количестве текстур, ведь каждая часть модели все равно будет использовать только определенную часть этой текстуры. Таким образом, эта текстура подойдет и для целостной модели, и для разбитой на сабмешы. Когда-то тут будут ссылки на крутые проекты. Или нет.
Сообщение отредактировал lentinant - Воскресенье, 09 Марта 2014, 00:43
А если я сделаю несколько объктов. Можно как нибудь соединить uv сетки? Чтобы загружалась только одна текстура.
Добавлено (09.03.2014, 14:40) --------------------------------------------- Ну например, в 3d редакторах если соединить несколько объектов их uv плюсуются и получается на выходе одна раазвертка
Сообщение отредактировал DantorS - Воскресенье, 09 Марта 2014, 14:39
На мой взгляд это уже какое-то издевательство. Зачем тратить столько времени на такой способ оптимизации? Unity3d стандартными средствами позволяет добиться хорошего FPS. Запускать игру, скажем, с очень маленькой дальностью прорисовки теней, хорошим LOD можно на очень дешевом компьютере. Стоимость комплектующих среднего класса сейчас ничтожно мала. Даже бюджетные видеокарты, например, GTX 750, дают приличную производительность. Возможно, такой подход и был бы уместен во времена AGP видеокарт, но точно не сейчас. Все разработчики стремятся максимально быстро и дешево выпустить свой продукт, а у Вас получается пустая трата времени. Даже, если в игре будет 100 FPS на видеокарте GeForce 8600, то мало кто оценит такую производительность. Большая часть геймеров сидит на хорошем железе, купленном для всяких крузисов, и им нужно подавать именно "Графон". Я советую не доходить до фанатизма. Займитесь непосредственно геймплеем.
Сообщение отредактировал Storm54 - Воскресенье, 09 Марта 2014, 15:24
Storm54, спасибо за обоснованное (хорошо расписанное) мнение. Не понимаю почему это оффтоп
Добавлено (09.03.2014, 15:51) --------------------------------------------- Еще интерсует мнение lentinant-а, это пустая трата времени или стоит повозиться
Добавлено (09.03.2014, 15:53) --------------------------------------------- Я уже заводил тему по поводу этого примера. http://gcup.ru/forum/59-38070-1#610813
Добавлено (09.03.2014, 15:56) --------------------------------------------- То есть если не оптимизировать способом описанным в этой теме (получится в 3-4 раза больше текстур) на производительность не сильно повлияет?
Нужно смотреть, сколько одновременно текстур видно в кадре. У меня ~100 текстур. GTX 570 стабильно выдает не ниже 100 кадров (разрешение 1920x1080) Можно создавать мета-текстуру, которая будет содержать в себе несколько обычных текстур, создать на основе этой текстуры материал и накладывать на объекты. Правда я так никогда не делал. Вообще таких серьезных проблем с производительностью лично у меня не возникало, хотя железо не топовое. Лучше в последствии поиграться с LOD - маленькие объекты полностью выключать, а большие объекты объединить в один и создать для него общую текстурную развертку.
Можно создавать мета-текстуру, которая будет содержать в себе несколько обычных текстур
Ты имеешь ввиду атлас? Если да, то он непоходит. Так как я делаю игру для ПК, для приемлигого качества атлас должен быть размеров 6000*6000-9000*9000. Компьютеру такую текстуру будет сложно обработать. Почему так много - карта нормалей, спекулар, цвет и все это в одной текстуре.