ПрограммированиеФорумГрафика

Рендер геометрии с лайтмап-атласом + альфатестом

#0
22:52, 20 мая 2016

На первый взгляд лоховской вопрос, но бошку сломать удалось:

- есть геометрия у которой для каждого треугольника хранится его минилайтмап в БАНКЕ лайтмапов (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
3:30, 21 мая 2016

Как делал я скриптом когда-то:
1. Всем мешам под лайтмапу создавалась вторая развёртка канал с именем UVLight.128, UVLight.256 и т.д. в зависмости от нужного размера
2. для мешей с этим каналом запекались лайтмапы указанного размера
3. затем лайтмапы распихивались по атласам (2048x2048), чтобы минимизировать кол-во переключений текстуры
4. меши сортируются с приоритетом по атласу, а затем по диффузке
5. далее для каждого меша при экспорте материала пишется имя атласа и scale / offset развёртки в нём конкретно для этого меша

В твоём случае, когда каждый отдельный треугольник имеет свою лайтмапу, я бы постарался запечь лайтмапы всех треугольников меша в одну текстуру, иначе ничего интересного с этой мешаниной не сделать.
Альфа-маски обычно хранят отдельно от диффузок, т.к. альфа-маска 8 бит на пиксель, а диффезка может и 4 быть в случае GPU компрессии (ну и такие текстуры должны быть квадратные, если планируется PVRTC)

#2
11:37, 21 мая 2016

XProger
> запечь лайтмапы всех треугольников меша в одну текстуру
то есть не по банкам а именно в 1 текстуру?
щас так

Изображение

ну и диффуза

Изображение


предлагаешь типа такого?

Изображение

то есть когда у меша только 1 развернутая текстура - я счтиаю для каждого пикселя его положение в 3д и считаю лайтмаппиксельЦвет?
и получаю лайтмап идентичный по развертке диффузе и потом рендерю меш просто набиндив эти 2 текстуры по одинаковым TC ?

#3
14:34, 21 мая 2016

Да, если развёртка диффузки не имеет перехлёстов по типу mirror, то можно использовать её в качестве лайтмап развёртки.

#4
18:21, 21 мая 2016

XProger
на худой конец можно будет сказать чтобы с миррорром не делали..

#5
16:52, 22 мая 2016

XProger
ты знаешь как-ниеть cpp либы которые загенерят развертку для меша, которые без текс. координат и еще бесплатные ?

я умещу его в одной текстуре и поссчитаю лайтмап...
у просто мешей уже из макса идет развертка, а на некоторых у каждой грани координаты 0...1  итп. Не в атласе там всё.

#6
18:27, 22 мая 2016

рассортируй чтобы минимзировать переключения текстур и шейдеров. Стейтмашина не любит смену стейта. Остальное уже не так важно.
Я сортирую так:
сначала по шейдеру, потом по материалу, потом по номеру банка лайтмапы. В этом случае кол-во переключений шейдера удаётся свести к минимуму.

ПрограммированиеФорумГрафика

Тема в архиве.