На первый взгляд лоховской вопрос, но бошку сломать удалось:
- есть геометрия у которой для каждого треугольника хранится его минилайтмап в БАНКЕ лайтмапов (N банков на весь уровень)
- есть диффузная текстура с альфой
Как это ОПТИМАЛЬНО отрендерить?
---------------------------------------------------------
Сейчас без альфа-теста:
берется и для каждого банка(атласа) лайтмапов выбирается ГРУППА трисов которые его юзают и потом рисуется за раз.
То есть drawelems вызывается столько раз сколько банков в худшем случае
там свой буфер со своими текс координатами
----------------
Если добавляется диффузная текстура с альфой, то добавляются еще TC, причем все треугольники могут юзать 1-ый банк текстур лайтмапа, НО 100500 разных диффузных текстур..
--------------------------------------------------------
Делается под gles2 и под non-nexgen hardware
- текс. атлас - сильно не gles и на десктопах невезде ( не забываем про sm2 железо для которого тоже лайтмапы рендерятся) + колво слоёв зависимо
- Думал забить в 3д текстуру деффузные альфа слои и записать просто номер по depthZTC - так 3д текстур нет в gles2 - Отметается
- Думал все альфамаски залить в 1 атлас и в том буфере просто ремапнуть TC которые были для 1 текстуры диффуза., - Тоже чет не прет - это если текстуры большого размера, то ограничено gl_max_2d_size - и все равно рано или позднол будет больше банков диффузов чем 1 - и опять группировать не получится
- лоховской метод: для каждого меша рисовать по одному треугольнику со своим куском из лайтмап банка и диффузтекстурой - тупо олдскул, но збс ложится
ТОЛЬКО для тех объектов у которых есть альфаслой
- улучшение предыдущего: группировать в буферы не только по лайтмапБанку, а еще по диффузтекстуре.. То есть будут лежать в буферах наборы , которые юзают одинаковый лайтмапБанк и одинаковую диффуз текстуру.. Уже рисовать не по 1 трису , а по 2 )))))))))))))))))))))))))
Альфатест сделан через discard если что
Рендер с диффузной текстурой отделен от рендера с лайтмапом.. оно идет в 2 прохода
-------------------------------------------------
????????
Как делал я скриптом когда-то:
1. Всем мешам под лайтмапу создавалась вторая развёртка канал с именем UVLight.128, UVLight.256 и т.д. в зависмости от нужного размера
2. для мешей с этим каналом запекались лайтмапы указанного размера
3. затем лайтмапы распихивались по атласам (2048x2048), чтобы минимизировать кол-во переключений текстуры
4. меши сортируются с приоритетом по атласу, а затем по диффузке
5. далее для каждого меша при экспорте материала пишется имя атласа и scale / offset развёртки в нём конкретно для этого меша
В твоём случае, когда каждый отдельный треугольник имеет свою лайтмапу, я бы постарался запечь лайтмапы всех треугольников меша в одну текстуру, иначе ничего интересного с этой мешаниной не сделать.
Альфа-маски обычно хранят отдельно от диффузок, т.к. альфа-маска 8 бит на пиксель, а диффезка может и 4 быть в случае GPU компрессии (ну и такие текстуры должны быть квадратные, если планируется PVRTC)
XProger
> запечь лайтмапы всех треугольников меша в одну текстуру
то есть не по банкам а именно в 1 текстуру?
щас так

ну и диффуза

предлагаешь типа такого?
-UV-fig.jpg)
то есть когда у меша только 1 развернутая текстура - я счтиаю для каждого пикселя его положение в 3д и считаю лайтмаппиксельЦвет?
и получаю лайтмап идентичный по развертке диффузе и потом рендерю меш просто набиндив эти 2 текстуры по одинаковым TC ?
Да, если развёртка диффузки не имеет перехлёстов по типу mirror, то можно использовать её в качестве лайтмап развёртки.
XProger
на худой конец можно будет сказать чтобы с миррорром не делали..
XProger
ты знаешь как-ниеть cpp либы которые загенерят развертку для меша, которые без текс. координат и еще бесплатные ?
я умещу его в одной текстуре и поссчитаю лайтмап...
у просто мешей уже из макса идет развертка, а на некоторых у каждой грани координаты 0...1 итп. Не в атласе там всё.
рассортируй чтобы минимзировать переключения текстур и шейдеров. Стейтмашина не любит смену стейта. Остальное уже не так важно.
Я сортирую так:
сначала по шейдеру, потом по материалу, потом по номеру банка лайтмапы. В этом случае кол-во переключений шейдера удаётся свести к минимуму.
Тема в архиве.
| Диван для кухни со спальным местом: кухонные уголки Диван для кухни со спальным местом: кухонные уголки со спальным местом. divanyug.ru |