Форум программистов, компьютерный форум, киберфорум
DirectX
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35

Несколько текстур на один объект

18.10.2017, 05:21. Показов 3991. Ответов 14

Студворк — интернет-сервис помощи студентам
Привет.

Уже несколько книг по Директу посмотрел, везде о текстурах говориться "очень много". Пропишите эти строчки и у вас на кубике появится текстура. Очень полезная информация.

Так вот, хотел спросить.

Как "разбить кубик на индексы" чтобы потом можно было создать функцию которая бы устанавливала несколько текстур на кубик по индексу? Ну например у меня есть здание (здание не кубик конечно, но такой же набор вершин) - крыша - 1 индекс, стены - 2 индекс, дверь - 3 индекс. Я просто мог прописать:

Code
1
2
3
SetTexture(0, "1textur");
SetTexture(1, "2textur");
SetTexture(2, "3textur");
И у меня на здании появились разные текстуры.

Вообще нигде не нашел информацию как на один объект накладывать несколько текстур. Спасибо.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.10.2017, 05:21
Ответы с готовыми решениями:

Несколько указателей на один объект
Добрый день, Есть объект и несколько ссылок на него в разных списках (например список для рисования, список для разных таблиц т.е...

Один объект на несколько классов
Есть класс переменные, в котором есть set и get методы. Есть класс в котором переменным присваиваются значения. Есть класс который...

Оптимизация работы с формами (один объект на несколько форм)
Доброго времени суток! В общем, перелопатил этот раздел форума, но понимание вопроса так и не пришло :( Ситуация такова ... У меня есть...

14
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
19.10.2017, 12:23
Лучший ответ Сообщение было отмечено GAwesoME как решение

Решение

Позвольте несколько советов/пояснений.
1. Не рекомендуется плодить огромное количество текстур. В вашем случае необходимые изображения рекомендуется собрать в одном файле, загрузить в одну текстуру, а на нужное место объекта изображение попадет с помощью текстурных координат.
2. Первый параметр метода SetTexture(...) используется не для некого индексирования фрагментов объекта, а для смешивания текстур в одном материале и означает стадии смешивания. До восьми стадий (0-7).
3. В Directx 9 есть класс/интерфейс Mesh/ ID3DXMesh с огромным количеством методов, свойств, функций. Специально для хранения "Mешей" разработан особый формат файлов(*.x). "Меши" могут содержать большое количество фрагментов, для каждого фрагмента свой материал, а материал может использовать смешивание нескольких текстур. Фрагменты "меша" проиндексированы выводятся с помощью метода DrawSubset(i), где i - номер фрагмента.
1
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
20.10.2017, 02:44  [ТС]
А то что в DX11 убрали .x файлы? Стоит остаться на DX9?
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
20.10.2017, 11:43
Цитата Сообщение от GAwesoME Посмотреть сообщение
А то что в DX11 убрали .x файлы?
Да, в DX11 нет ни "мешей" ни .х файлов там нет даже "фонтов"(класс/интерфейс для вывода текста). Все придется писать самому или разбираться в сторонних библиотеках. Все эти классы "высокого уровня" были написаны под фиксированный графический конвейер DX9, а в DX11 фиксированного графического конвейера нет.
Цитата Сообщение от GAwesoME Посмотреть сообщение
Стоит остаться на DX9?
Начинать изучение Direct3D, мне кажется, проще с DX9, - результаты будут значительно быстрее.
0
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
20.10.2017, 18:01  [ТС]
Получается, что мне на каждый объект нужно создавать файл .png например со всеми текстурами которые мне нужно наложить на этот объект? Ну то есть у меня файлы

1textur.png
2textur.png
3textur.png

и я их собираю в движке в один файл .png подгоняя под здание

Ведь текстуры могут повторятся. Например текстуру асфальта я могу наложить и на крышу здания и на просто дорогу. Не буду же я два раза копировать эту текстуру.

Добавлено через 3 часа 2 минуты
Или даже допустим я пишу движок на DirectX9, то в .x файле хранится и текстура. И получается что в каждом .x файле дублируется одинаковая текстура которую я использую на разных объектах? Как-то не оптимизировано получается...
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
20.10.2017, 19:39
Цитата Сообщение от GAwesoME Посмотреть сообщение
Получается, что мне на каждый объект нужно создавать файл .png
Часто одну большую текстуру(текстурный атлас) используют для нескольких объектов.
Не запрещается для одного большого и сложного объекта (например ландшафта) использовать несколько текстур.

Если Вам всё-таки необходимо для разных частей объекта использовать разные текстуры, - просто перед выводом каждой части устанавливаете нужную текстуру.
SetTexture(0, ...);
Но учтите, даже если текстуры загружены заранее, частое использование SetTexture(...); замедляет процесс отрисовки.
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
20.10.2017, 20:53
Цитата Сообщение от GAwesoME Посмотреть сообщение
Или даже допустим я пишу движок на DirectX9, то в .x файле хранится и текстура.
В .х файле текстуры не хранятся, там только имена файлов для загрузки текстур. Бывают .x файлы трех видов: текстовые, бинарные и сжатые бинарные. Текстовые можно открыть простым блокнотом, вот например: h001.zip
0
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
20.10.2017, 23:20  [ТС]
Просто я пишу игру скажем так с кастомизацией с помощью скриптинга. И требуется такая функция как создание какого-то стандартного объекта взятого игроком из мира (например шкафа) и можно было наложить на его дверцы текстуру другого объекта (например кожаного дивана). И получалось что-то типа кожаного шкафа.

Именно чтобы это мог делать игрок, а не я, рисуя уже одну готовую текстуру на объект.

Такая возможность очень хорошо показана в SA-MP'е (GTA SA + мультиплеер)

Берем текстуру со стены другого > ставим ее на индекс текстуры дома 0 > текстура на крыше


Берем и меняем индекс на 1 > текстура на дверях гаража


Вот как-то так...
0
61 / 54 / 21
Регистрация: 19.10.2013
Сообщений: 117
21.10.2017, 13:03
В самых общих чертах можно предложить следующий порядок действий

В 3D редакторе
создаем модель из нескольких объектов (n) и экспортируем ее в *.x - файл.

В программе
создаем массив текстур (m) загружаем массив текстурами;
создаем "Меш" и грузим его из *.х - файла, у него получится n фрагментов;
создаем массив индексов int ind[n] заполняем его нужными номерами текстур (0 - m);
выводим в цикле:
C++
1
2
3
4
5
6
7
8
...
for(int i = 0; i < n; i++)
{
     Device->SetMaterial(...);
     Device->SetTexture(0, textures[ind[i]]);
     Mesh->DrawSubset(i);
}
...
Останется "самое простое" - создать интерактивный механизм выбора фрагмента объекта и образца текстуры с целью замены номера текстуры в массиве индексов.
1
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
22.10.2017, 03:42  [ТС]
Спасибо, попробую, получиться - отпишусь)0)

Добавлено через 11 часов 20 минут
Все таки решил DX11 изучать. Много слишком отличий.

Сейчас я пишу свой формат хранения объектов.
Получилось что-то типа такого -

1) При запуске игры грузится файл в массив с глобальными координатами всех объектов и с названием файлов объектов


2) Потом грузятся файлы уже этих объектов в массив


3) При рендере каждого кадра проверяется находится ли камера в радиусе этого объекта и если да объект рендерится

Как видно в файле - один объект состоит из нескольких под-объектов и наложение на них уже текстуры. Получается что для каждого из этих под-объектов нужно отдельно делать индексы для соединения вершин. И как бы если делать так - то нужно дублировать вершины для каждого под-объекта.... Как-то не оптимизировано получается...
0
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
27.10.2017, 00:11  [ТС]
up1
0
15 / 16 / 6
Регистрация: 24.10.2017
Сообщений: 48
27.10.2017, 09:32
Цитата Сообщение от GAwesoME Посмотреть сообщение
Как "разбить кубик на индексы" чтобы потом можно было создать функцию которая бы устанавливала несколько текстур на кубик по индексу?

Если я правильно понял: есть модель, и хочется использовать множество разных текстур.

Это можно сделать.

Нужно разбить модель на субмодели, мешбуферы.

Например, в 3ds max если сделать куб и сферу (просто 2 разных объекта), выделить их мышкой, и экспортировать например в OBJ, то создадутся группы. Первая для куба, вторая для сферы.

Задача для твоего движка такова.

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
struct SubModel{
int index_count;
int vertex_count;
MyVertex* verts;
short* inds;
 
MyMaterial material; // в таких структурах можно хранить тип шейдера, указатели на текстуры и т.д.
};
 
struct Model{
std::vector<SubModel> m_buffers;
};
В рендеринге делается типа такого
C++
1
2
3
4
5
6
7
auto bufcount = model->m_buffers.size();
for( auto i = 0; i < bufcount; ++i ){
 
УстановитьШейдер(model->m_buffers[i].material);
РисоватьИндексированныйБуффер(model->m_buffers[i]);
 
}
0
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
27.10.2017, 23:41  [ТС]
Ну, а на пример у меня есть куб и если и мне нужно на разные стороны - разные текстуры. И если я разделю каждую сторону на отдельную модель, то вершины будут повторяться (ну рендерить то каждую отдельную модель нужно по отдельности, значит соединять вершины индексами по не получиться). Это как-то влияет на производительность?
0
 Аватар для Byurrrer
6 / 6 / 0
Регистрация: 28.10.2017
Сообщений: 17
28.10.2017, 20:14
Цитата Сообщение от GAwesoME Посмотреть сообщение
Ну, а на пример у меня есть куб и если и мне нужно на разные стороны - разные текстуры. И если я разделю каждую сторону на отдельную модель, то вершины будут повторяться (ну рендерить то каждую отдельную модель нужно по отдельности, значит соединять вершины индексами по не получиться). Это как-то влияет на производительность?
Вообще индексы для того и созданы - чтобы сократить количество дублированных вершин, порой можно сократить аж в 2 раза.
Для того чтобы на модель можно было накладывать разные текстуры надо чтобы модель содержала подгруппы.
ID3DXMesh предлагает делить модель на подгруппы при помощи числовых атрибутов [0,N].
Рекомендую к прочтению (гуглиться): Франк Луна - Введение в программирование трехмерных игр с DX9
В этой книге много базовых моментов объясняются достаточно подробно.
Вообще чем больше DIP (draw indexed primitive) тем медленнее, но опять же здесь не линейная зависимость, к примеру 1 и 10 не заметно, а вот 1 и 10000 уже будет висеть. Я как то анализировал количество дипов в серии игр сталкер, там примерно около 500 дипов (200-800).

Добавлено через 5 минут
ИМХО, лучше DirectX 9 освоить, по нему материалов и избитых вопросов намного больше чем по тому же DirectX 11, управление отличается.
1
0 / 0 / 1
Регистрация: 13.03.2017
Сообщений: 35
28.10.2017, 22:01  [ТС]
Спасибо, почитаю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.10.2017, 22:01
Помогаю со студенческими работами здесь

Как отрисовывать один объект несколько раз! HTML 5 CANVAS
Такая история! Есть плавно увеличивающийся круг на полотне canvas! (круг появляется в рандомном месте полотна canvas). Как мне вызывать...

Как объединить несколько полигонов и создать из них один объект
Как объединить несколько полигонов(например острова), создать из них один объект, а потом добавить их так Karta.Children.Add(объект), или...

Не получается отрисовывать один объект несколько раз! HTML 5 CANVAS
Здравствуйте! Я хочу, чтобы при клике на canvas добавлялся один объект в виде эллипса с координатами клика мыши. Этих объектов может...

Один и тот же объект в одном выражении модифицируется несколько раз - неопределенное поведение
Уважаемые форумчане! Недавно столкнулся с интересным на мой взгляд необычным поведением компилятора c++ от keil. Определил класс шаблон...

Несколько текстур
Привет, пытался сделать все по урокам, не очень то получается, не могу найти как вставить несколько текстур в одну программу? я рисую...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru