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

Покритикуйте дикую идею касательно рендера

Advanced: Тема повышенной сложности или важная.

#0
10:34, 16 сен. 2016

Пытаюсь составить концепт рендера ландшафта. Что так корячусь, что этак - не выходит каменный цветок.

Проблема: нужен меш с варьирующим в широких пределах количеством текстур на полигон. От одной-двух у большинства до пяти и больше в специфических случаях пересечений многих материалов или декалей. Или пересечений многих маериалов с декалями.

Причём, должно резво ползать на low-end видеокартах (шкала, примерно: в районе GF 7xxx с пассивным охлаждением - нижний конец, HD 3000 - средняя, GTX 460 - сверхмогучая)

Мучился-мучился, получается толпа в 90% случаев ненужных varying, которая раздует размер меша до неприличных размеров, либо бить его на кусочки сортируя по количеству текстур на полигон.

Возникла идея: переменную часть меша запечь в текстуру, и распаковывать в шейдере, в который uniform'ами передавать координаты данных в этой текстуре.

Минус: на целевом уровне древности GAPI читать текстуру в вершинном шейдере не получится, распаковывать придётся в фрагментном.

Тогда меш содержит а вершинный шейдер передаёт фрагментному:

- varying vec3 (координаты вершины)
- varying vec3 (нормаль вершины)
- varying vec3 (цвет освещения)
- varying vec2 (координаты внутри полигона, приведённые к 0..1)
- uniform (координаты описания полигона в текстуре) Ntk

Текстура (int16 или упакованная в обычную RGBA8) содержит (последовательности переменной длины):
- 1 длина последовательности
- N * (
  - 1 индекс текстуры в атласе
  - 1 альфа слоя
  - 1 clamp выборки из атласа (зацикленная для текстур, обрезанная по краю для декалей)
  - 2 s,t нуля координат в Ntk
  - 2 ds,dt координат в Ntk
  - 4 цвет или палитра в текстуре палитр
)

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

В плюсах:
- меш худой
- меш один
- данные в описательной текстуре зело компактны

В минусах:
- фрагментный шейдер зело толстый (просадки по текселям будут компенсироваться DRR, поэтому что его толщина влияет лишь на чёткость картинки, но никак не на FPS)

Какие мысли?

Где-нибудь такой изврат применялся на практике?


#1
11:04, 16 сен. 2016

Cheb
> От одной-двух у большинства до пяти
Где ты столько насчитал? Для квадрата ландшафта максимум - 4 различных тексутры в разных вершинах.
> декалей
Их лучше вообще в отдельный меш.

> varying vec3 (координаты вершины)
> varying vec2 (координаты внутри полигона, приведённые к 0..1)
Можно заменить на один varying.
А координаты внутри полигона получать через mod.
Но это будет конечно работать при регулярной сетке.

> (нормаль вершины)
Можно хранить в текстуре и делать выборку по координатам.
> (координаты вершины)
Высоту тоже можно в текстуре хранить.

> 4 цвет или палитра в текстуре палитр
А ещё и цвет то зачем? Он реально где-то нужен?

#2
11:35, 16 сен. 2016

>А ещё и цвет то зачем? Он реально где-то нужен?
Экономия на текстурах:
- трава/жухлая трава/фиолетовая инопланетная трава = одна и та же текстура
- пятна крови/пятна грязи/пятна зелёной краски = одна и та же текстура
и т.п.

>Но это будет конечно работать при регулярной сетке.
Сетка что угодно, но НЕ регулярная, что-то врорде майнкрафт 2.0 со сглаживанием горизонтальных поверхностей, но потенциально с с дырками и норками, с тысячами их.
В качестве вдохновителя см. Planet Explorers, там каждый воксель - кубометр, НО поддерживается весьма дробное его заполнение, в результате спокойно рассекаешь на джипе по вполне себе округлым холмам.


>> (нормаль вершины)
>Можно хранить в текстуре и делать выборку по координатам.
Вот нормаль-то точно varying, не заводить же для неё отдельную текстуру
bump текстура - это уже сущность часть атласа, т.е. фактически в одной текстуре и RGBA и бамп, и каждый слой - две выборки из атласа.


>Их лучше вообще в отдельный меш.
Нууу, тоже думал, но проблему это не снимает.
Пример: на одном треугольнике пересекаются 3 вида (грязь, песок, камень) + ближайшее дерево добавило корни + игрок начал копать и насыпал тонкий, пока ещё прозрачный слой гравия + там завалили монстра, что добавило тонкий, частично прозрачный слой крови, бамп которой должен повторять бамп подлежащей поверхности, но сделать её красной и блестящей.
И опаньки.
P.S. *Три* выборки на слой, RGBA, бамп с собственной прозрачностью, цвет спекуляра (иначе не получить нормального золота и всякого экзотического фиолетового блеска). Всё на усмотрение атласа, если не нужно - указывает для той текстуры на пустой тексель.

#3
11:45, 16 сен. 2016

Cheb
> Пример: на одном треугольнике пересекаются 3 вида (грязь, песок, камень) +
> ближайшее дерево добавило корни + игрок начал копать и насыпал тонкий, пока ещё
> прозрачный слой гравия + там завалили монстра, что добавило тонкий, частично
> прозрачный слой крови, бамп которой должен повторять бамп подлежащей
> поверхности, но сделать её красной и блестящей.
> И опаньки.
Попробуй мегатекстуру.

#4
12:13, 16 сен. 2016

>Попробуй мегатекстуру.
Прикидывал, выходит слишком толсто для целевых видеокарт, у них основная ахиллесова пята - аховая пропускная способность по пикселам/текселам.

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

#5
17:49, 16 сен. 2016

Cheb
> см. Planet Explorers, там каждый воксель - кубометр, НО поддерживается весьма
> дробное его заполнение
Там геометрия ландшафта строится через маршинг кубс.
Cheb
> + ближайшее дерево добавило корни + игрок начал копать и насыпал тонкий, пока
> ещё прозрачный слой гравия + там завалили монстра, что добавило тонкий,
> частично прозрачный слой крови
Это должны быть скрин спейс декали. Они рисуются отдельно. Если конечно ты не хочешь делать необъятные поля крови.

#6
18:16, 16 сен. 2016

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

>Если конечно ты не хочешь делать необъятные поля крови.
Именно их, именно их.
+ бороться с периодичностью текстуры, накладывая один и тот же относительно небольшой кусок с рандомными углами поворота и смещениями + смешивая его с собой же по карте высот.
+ скрин-спейс декали не смешаешь по карте высот (чтобы корни проглядывали, например, во вмятинах, плавно заглубляясь от дерева в землю). Или сделаешь, но это, блин, буфер дополнительный, дорого!

#7
18:28, 16 сен. 2016

З.Ы. Почему я вообще о такой системе начал думать - очень не хочется распухания данных или дополнительных проходов рендера. Это всё дорого.
А вот насколько дорог окажется утяжелённый шейдер? Пока его не создашь - не узнаешь :(

Пока что, мои ковыряния GLSL на HD 3000 показали, что даже довольно дебильные шейдеры могут иметь вес пера, если все их выборки кучкуются в достаточно маленьком участке текстуры.

З.З.Ы И всё вышеобсуждаемое - для зоны дальше 10..20 метров. Для ближайших чанков будет как раз микромегатекстура.

#8
18:31, 16 сен. 2016

Cheb
> Может, у них у каждого вокселя битовая маска выколупанных частей есть? очень
> похоже на то.
Нет, у них определенно маршинг кубс с весами. Вот тебе для 2д мануал http://jamie-wong.com/2014/08/19/metaballs-and-marching-squares/ они делают тоже самое но в 3д.

Cheb
> чтобы корни проглядывали, например, во вмятинах, плавно заглубляясь от дерева в
> землю
Такое вообще геометрией надо делать

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

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