Управление 3D-ресурсами (в частности, сэмплерами) - PullRequest
0 голосов
/ 29 марта 2012

У меня вопрос о том, как организовать мои графические ресурсы / объекты. Я импортирую сцены из 3D Studio, используя AssImp. В данный момент я обрабатываю структуры AssImp в свои собственные, чтобы я мог передавать их на диск и с диска быстрее, чем AssImp. Во всяком случае, я также обрабатываю материалы сцены, что дает мне набор вариантов, с которыми я не совсем уверен, как лучше всего справиться.

У меня есть следующие классы для материалов:

Материал

Содержит такие вещи, как окружающий, диффузный цвет, зеркальная мощность и т. Д., Также содержит массив карт, причем каждый слот в массиве является «каналом» (т. Е. Слот 0 всегда является картой окружения, слот 1 диффузный, слот 2 глянец и тд).

Карта

Экземпляр карты с такими параметрами, как режим обтекания и указатель на объект текстуры.

Texture

Карта текстур OpenGL.

Sampler

Объект сэмплера OpenGL.

Теперь мне немного интересно, как я собираюсь обращаться с настройкой сэмплеров для любой карты в материале. Технически каждая карта может иметь разные параметры сэмплера. Например, сэмплер может иметь режимы УФ-обтекания, минимальный и максимальный фильтры и анизотропию. Некоторые из этих параметров определены в сцене (режимы обтекания), а другие определены как параметры движка (фильтрация, анизотропия).

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

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

У кого-нибудь есть мнение о том, как лучше всего управлять такими вещами?

1 Ответ

1 голос
/ 29 марта 2012

Это действительно не сложная проблема.

Сколько было бы разных типов пробников? Если ваша фильтрация является глобальной концепцией, то основное различие между сэмплерами будет в режимах переноса. Существует три измерения обтекания (S, T, R) и 4 возможных типа обтекания (CLAMP_TO_EDGE, CLAMP_TO_BORDER, REPEAT и MIRROR_REPEAT). Это дает вам всего ... 12 возможных сэмплеров, которые вы можете использовать для обычных вещей.

CLAMP_TO_BORDER требует цвет границы, поэтому для этого потребуется уникальный объект сэмплера (если только многие текстуры не имеют одинаковый цвет границы, что не является необоснованным. Черный - популярный выбор). А если вы делаете выборку сравнения глубины, вам понадобится еще несколько объектов сэмплера.

Так что просто имейте диспетчер объектов сэмплера, у которого вы можете запросить сэмплер. Вы даете ему некоторые параметры, и он извергает сэмплер. Это либо сэмплер, который существует, либо созданный специально для вас. Если вам нужен уникальный (для бордюров), то вы можете попросить предоставить вам уникальный. В противном случае, если два человека попросят один и тот же пробоотборник, они получат такой же пробоотборник.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...