Четверг, 28 Марта 2024, 18:19

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Текстурирование материалов по скрипту
Текстурирование материалов по скрипту
DantorSДата: Понедельник, 03 Марта 2014, 08:45 | Сообщение # 1
заслуженный участник
Сейчас нет на сайте
Допустим есть 3d модель. При нажатии на кнопку (кнопка в данном случае - кнопка изменения параметров (меню настроек), для оптимизации на неподходящих для работы компьютеров) нужно чтобы 3 материала распределялись по 3d модель по нужным мне параметрам. Один на одежду, другой на волосы, третий на тело. Что определяет эти параметры. Ведь по началу всё легко. Нанес текстуры в 3ds max, экспортировал в unity, в unity они окрасились в рандомные цвета и просто надо нужные мне материалы поставит на эти цвета. А что определяет эти параметры я так и не понял.

Сообщение отредактировал DantorS - Воскресенье, 09 Марта 2014, 14:40
Storm54Дата: Понедельник, 03 Марта 2014, 11:21 | Сообщение # 2
постоянный участник
Сейчас нет на сайте
Экспортировать модель, которая будет состоять из нескольких объектов. Дальше на каждый объект можно натянуть материал.
Примерно так(писал по памяти)
Код

Material mat1 = Resources.Load("MyMaterial") as Material;
transform.Find("Object").material = mat1;


В данном случае загрузим материал из ресурсов и присвоим дочернему объекту с именем Object.
Аналогично и с другими объектами
Это при условии, что скрипт висит на самом объекте.


Сообщение отредактировал Storm54 - Понедельник, 03 Марта 2014, 11:23
GantZ_YakaДата: Понедельник, 03 Марта 2014, 13:25 | Сообщение # 3
почетный гость
Сейчас нет на сайте
Есть способ шейдеры менять, в разных материалах на одном цельном объекте. Делал так, когда нужно было на анимированной модели скрывать руки/ноги и потом снова показывать.
Делал так. Сперва нужно в редакторе моделей (использовал 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;   

}
DantorSДата: Пятница, 07 Марта 2014, 23:56 | Сообщение # 4
заслуженный участник
Сейчас нет на сайте
Мне нужно чтобы статично был один материал на всю модель, а при нажатии на кнопку один материал на тело, другой на одежду, третий на волосы.

Storm54, твой вариант не подходит. Я же задал совсем другой вопрос.
GantZ_Yaka, я уже в вопросе описал что твой вариант делается легко.
Цитата DantorS ()
Ведь по началу всё легко. Нанес текстуры в 3ds max, экспортировал в unity, в unity они окрасились в рандомные цвета и просто надо нужные мне материалы поставит на эти цвета. А что определяет эти параметры я так и не понял.

Но как сделать чтобы статично был один материал на всю, а при нажатии на кнопку они распределялись.

Добавлено (06.03.2014, 15:36)
---------------------------------------------
???

Добавлено (07.03.2014, 23:56)
---------------------------------------------
Ну и почему все молчат? Кто-то же должен знать? Неужели по скрипту определить место фиксации полигонов сложно - кто-то же должен знать как?

Сообщение отредактировал DantorS - Понедельник, 03 Марта 2014, 18:25
berilДата: Суббота, 08 Марта 2014, 02:38 | Сообщение # 5
Я не ленивый, я — энергосберегающий
Сейчас нет на сайте
Я лично ничего не понял из того, что хочешь biggrin
выражайся более ясней




Накодил? Убери за собой!
Инвентарь в Unity(UI)
Инвентарь в Unity(GUI)
DantorSДата: Суббота, 08 Марта 2014, 02:50 | Сообщение # 6
заслуженный участник
Сейчас нет на сайте
Есть кнопка off/on. Если off накладываются 3 материала на модель (волосы,одежа,тело). Если on накладывается один материал на все. Не понятно что в unity (в скриптинге) отвечает за фиксацию полигонов (определние того, на какие полигоны нужно наносить материал)

Сообщение отредактировал DantorS - Суббота, 08 Марта 2014, 02:59
lentinantДата: Суббота, 08 Марта 2014, 08:24 | Сообщение # 7
ленивый программист
Сейчас нет на сайте
Цитата DantorS ()
Ну и почему все молчат? Кто-то же должен знать?

Потому что бред какой-то спрашиваешь. Что-то я вообще нигде не слышал о таком, что ты хочешь сделать. Определение наложения текстуры на модель определяется разверткой, и на одну модель мы вешаем либо пару текстур, либо одну. О промежуточном варианте (чтобы можно было вешать разное количество текстур) я не слышал.

И зачем вообще такие сложности нужны? Обязательно нужно делать отдельно три материала? Если да, то почему нельзя просто сделать отдельную текстуру на каждую часть, а при нажатии кнопки, просто назначать на все части одинаковую текстуру?

Добавлено (08.03.2014, 08:24)
---------------------------------------------
Если охота ковырять это все из кода, копай в сторону класса Mesh (подозреваю, тебе придется оперировать с массивом UV координат) и понятия subMeshes.


Когда-то тут будут ссылки на крутые проекты. Или нет.
DantorSДата: Суббота, 08 Марта 2014, 14:34 | Сообщение # 8
заслуженный участник
Сейчас нет на сайте
Цитата lentinant ()
Потому что бред какой-то спрашиваешь. Что-то я вообще нигде не слышал о таком, что ты хочешь сделать. Определение наложения текстуры на модель определяется разверткой, и на одну модель мы вешаем либо пару текстур, либо одну. О промежуточном варианте (чтобы можно было вешать разное количество текстур) я не слышал.

Как ты думаешь: если слабый компьютер: ему с чем будет проще работать с 60 текстурами или с 600?

Добавлено (08.03.2014, 14:34)
---------------------------------------------

Цитата DantorS ()
Если охота ковырять это все из кода, копай в сторону класса Mesh (подозреваю, тебе придется оперировать с массивом UV координат) и понятия subMeshes.

Спасибо, нашел. Но для того что мне нужно надо заполнять список треугольников вручную (брать координаты треуголбников, и заносить в эти координаты в список треугольников submesh-a). Нет способа проще. (это получится слишком долго). Или взять submesh (с 3 материалами) и оттуда вытащить этот список.
lentinantДата: Суббота, 08 Марта 2014, 19:06 | Сообщение # 9
ленивый программист
Сейчас нет на сайте
Цитата DantorS ()
Как ты думаешь: если слабый компьютер: ему с чем будет проще работать с 60 текстурами или с 600?

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


Когда-то тут будут ссылки на крутые проекты. Или нет.
DantorSДата: Суббота, 08 Марта 2014, 20:32 | Сообщение # 10
заслуженный участник
Сейчас нет на сайте
Оптимизация - это всегда хорошо. Например, я не могу очень многие игры после 2010 не могу запустить на своем ПК. И вообще оптимизации много не бывает. Так что с моим вопросом? Как вытащить список координат?
lentinantДата: Суббота, 08 Марта 2014, 21:11 | Сообщение # 11
ленивый программист
Сейчас нет на сайте
Цитата DantorS ()
Так что с моим вопросом? Как вытащить список координат?

Модель в классе представлена массивом треугольников и вертексов. Массив треугольников, по сути, показывает, какие индексы массива вертексов формируют треугольник, то есть, этот массив всегда кратен числу 3. То есть, чтобы нарисовать обычный тетраэдр, нам необходим массив с четырьмя вертексами, и массив треугольников размером 12 - четыре комбинации, отвечающие за треугольники модели, по три вертекса каждая. Это так, лирическое отступление насчет организации модели, вдруг кому интересно.

А для нескольких субмешей, я так понял, используется все тот же общий массив вертексов, просто для каждого субмеша свой массив треугльников. Получить или назначить массив треугольников для субмеша достаточно функциями SetTriangles и GetTriangles. Ну и менять subMeshCount. Массив же UV координат на это не рассчитан. Приятного изобретения велосипеда.


Когда-то тут будут ссылки на крутые проекты. Или нет.
DantorSДата: Суббота, 08 Марта 2014, 23:02 | Сообщение # 12
заслуженный участник
Сейчас нет на сайте
А какая разница? Полигон меша соответствует uv полигону. Тоесть в uv сетке отражается каждый полигон mesh-a.

Добавлено (08.03.2014, 22:48)
---------------------------------------------
Я же могу нанести материал на этот полигон?

Добавлено (08.03.2014, 23:00)
---------------------------------------------
Какие могут быть сложности?

Добавлено (08.03.2014, 23:02)
---------------------------------------------

Цитата DantorS ()
Массив же UV координат на это не рассчитан. Приятного изобретения велосипеда.

Я что правда несу бред, или я просто туплю, или просто не понимаю?


Сообщение отредактировал DantorS - Суббота, 08 Марта 2014, 23:00
lentinantДата: Суббота, 08 Марта 2014, 23:28 | Сообщение # 13
ленивый программист
Сейчас нет на сайте
Цитата DantorS ()
Я что правда несу бред, или я просто туплю, или просто не понимаю?

Ты просто делаешь то, чего никто не делал. С последнего, кстати, делается простой итог - этого никто не делал, потому что это никому не нужно.

Добавлено (08.03.2014, 23:28)
---------------------------------------------

Цитата DantorS ()
А какая разница? Полигон меша соответствует uv полигону. Тоесть в uv сетке отражается каждый полигон mesh-a.

Факт остается фактом, в определении класса Mesh нет функционала для назначения UV координат на конкретный субмеш. То есть, тебе в любом случае надо будет использовать одну сетку uv координат на все субмешы. То есть, по сути, ты можешь сделать три субмеша, чтобы каждый из них использовал отдельный материал, однако, текстуры для этих материалов все равно должны иметь уникальные uv координаты.


Когда-то тут будут ссылки на крутые проекты. Или нет.

Сообщение отредактировал lentinant - Суббота, 08 Марта 2014, 23:24
DantorSДата: Суббота, 08 Марта 2014, 23:44 | Сообщение # 14
заслуженный участник
Сейчас нет на сайте
Ладно, попробую реализовать свою идею. Отпишусь в теме. lentinant, спасибо за ответы.

Добавлено (08.03.2014, 23:36)
---------------------------------------------
Цитата lentinant ()

Факт остается фактом, в определении класса 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
lentinantДата: Воскресенье, 09 Марта 2014, 00:34 | Сообщение # 15
ленивый программист
Сейчас нет на сайте
Цитата DantorS ()
Как я понял разные. Но это нереально потому что модель одна с одной разверткой. Тогда как же быть

Цитата DantorS ()
Все понял, делать текстуры, но с разверткой на всю модель. Да?

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


Когда-то тут будут ссылки на крутые проекты. Или нет.

Сообщение отредактировал lentinant - Воскресенье, 09 Марта 2014, 00:43
DantorSДата: Воскресенье, 09 Марта 2014, 14:40 | Сообщение # 16
заслуженный участник
Сейчас нет на сайте
А если я сделаю несколько объктов. Можно как нибудь соединить uv сетки? Чтобы загружалась только одна текстура.

Добавлено (09.03.2014, 14:40)
---------------------------------------------
Ну например, в 3d редакторах если соединить несколько объектов их uv плюсуются и получается на выходе одна раазвертка

Сообщение отредактировал DantorS - Воскресенье, 09 Марта 2014, 14:39
Storm54Дата: Воскресенье, 09 Марта 2014, 15:24 | Сообщение # 17
постоянный участник
Сейчас нет на сайте
Оффтоп


Сообщение отредактировал Storm54 - Воскресенье, 09 Марта 2014, 15:24
DantorSДата: Воскресенье, 09 Марта 2014, 15:56 | Сообщение # 18
заслуженный участник
Сейчас нет на сайте
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 раза больше текстур) на производительность не сильно повлияет?

Storm54Дата: Воскресенье, 09 Марта 2014, 17:51 | Сообщение # 19
постоянный участник
Сейчас нет на сайте
Нужно смотреть, сколько одновременно текстур видно в кадре. У меня ~100 текстур. GTX 570 стабильно выдает не ниже 100 кадров (разрешение 1920x1080)
Можно создавать мета-текстуру, которая будет содержать в себе несколько обычных текстур, создать на основе этой текстуры материал и накладывать на объекты. Правда я так никогда не делал.
Вообще таких серьезных проблем с производительностью лично у меня не возникало, хотя железо не топовое. Лучше в последствии поиграться с LOD - маленькие объекты полностью выключать, а большие объекты объединить в один и создать для него общую текстурную развертку.
DantorSДата: Воскресенье, 09 Марта 2014, 18:30 | Сообщение # 20
заслуженный участник
Сейчас нет на сайте
Цитата Storm54 ()
а большие объекты объединить в один и создать для него общую текстурную развертку.

И как? Ведь lod действет лишь на каждую модель. А об общем lod-e я не слышал

Добавлено (09.03.2014, 18:30)
---------------------------------------------

Цитата DantorS ()
Можно создавать мета-текстуру, которая будет содержать в себе несколько обычных текстур

Ты имеешь ввиду атлас? Если да, то он непоходит. Так как я делаю игру для ПК, для приемлигого качества атлас должен быть размеров 6000*6000-9000*9000. Компьютеру такую текстуру будет сложно обработать. Почему так много - карта нормалей, спекулар, цвет и все это в одной текстуре.
Форум игроделов » Движки для разработки игр и сложные системы разработки » Unity » Текстурирование материалов по скрипту
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг