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

Deferred Decals + MSAA

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

#0

Всем привет! Кто-нибудь пытался подружить Deferred с MSAA? Я раскурил пару статей, вроде уже понимаю тему. У меня Forward с Z препассом и кластерами, но я хочу deferred декали, чтобы разгрузить основной шейдер и не гемороиться с атласами для декалей. Через SV_Coverage можно пометить пиксели, в которых будет сглаживание и только для них запускать шейдер с sample frequency. Я не совсем понял, как их пометить. По-хорошему, это надо в стенсил пометить, но как из шейдера писать в стенсил?
Допустим я все пометил и отрендерил в 2 прохода (обычный и sample frequency). На выходе получил MSAA текстуру. Как ее семплить в основном шейдере?

11 янв. 2019, 0:41

#1

Чтобы понять нужно ли использовать все сэмплы ты либо записываешь 1 бит в какую-либо текстуру, либо делаешь цикл по всем сэмплам и сравниваешь их с нулевым, если различаются, то делаешь сложный АА, иначе простой.
Сложный АА это когда ты считаешь освещение для каждого сэмпла, а потом усредняешь.
Но вообще это не очень быстро работает.

11 янв. 2019, 1:45

#2

При рендеринге z-препасса я могу сохранить countbits(SV_Coverage) == msaa_samples, это и будет тот самый 1 бит, о котором ты говоришь. Но мне этот бит нужно не просто в текстуру сохранить, а именно в стенсил. Потому что дальше я буду запускать шейдер декали в 2 прохода, один для сложных пикселей, другой для простых. Я использую SV_SampleIndex, это заставит пиксельный шейдер отработать для всех msaa семплов (sample frequency). Поэтому мне нужен стенсил, чтобы этот шейдер отработал только на сложных пикселях.

11 янв. 2019, 7:27

#3

Bonus
> но как из шейдера писать в стенсил?
SV_StencilRef, но это только в DX11.3/DX12, и то ещё не на всех видеокартах работает.

11 янв. 2019, 7:29

#4

Ага, я нашёл SV_StencilRef, спасибо. У нас dx11.0 и хочется, чтобы работало на всех видяхах. Придётся как-то из текстуры переносить в стенсил. Типа фуллскрин пасс с clip’ом. Как лучше сделать?

11 янв. 2019, 7:36

#5

есть же демка NVidia

https://developer.nvidia.com/gameworks-directx-samples

11 янв. 2019, 10:15 (Правка: 10:18)

#6

Я статью вижу а сорцов там нет.

11 янв. 2019, 10:16

#7

https://developer.nvidia.com/gameworksdownload

11 янв. 2019, 10:18

#8

А, блин, она внутри пакета с семплами, чет я затупил. Спасибо

11 янв. 2019, 10:28

#9

Ну да, у них в демке фуллскрин пасс с clip'ом, чтобы маску перенести из текстуры в стенсил, как я и думал.

11 янв. 2019, 10:43

#10

Глянь старую доку по крайзису3 со стр. 42: https://www.slideshare.net/TiagoAlexSousa/rendering-technologies-… is-3-gdc-2013
Таким способом сделано было у них и в гта5.
По сути делаешь edge detect обычным пиксельным шедйером с отключённм цветом и depthwrite'ом, чисто в стенсил, если есть едж - записывается бит, если нет - discard.
Далее они рисуют квад с деферед освещением обычным, который скипается стенсилом там где еджи, а затем второй такой же, но с полным циклом по всем MSAA семплам в гбуфере и усреднением результата - только на еджах.
В твоём случае можно рисовать сами декали два раза - вне еджей (как обычно) и на еджах (цикл и усреднение).

Скипание пикселей еджами через стенсил однако не совсем оптимально, т.к. гпу объединяет соседние пиксели в группы, а еджи тонкие - выходит, вместо того чтобы параллельно обработать, скажем, 16 тяжёлых еджевых пикселей, потоки будут забиты небольшим числом еджевых вперемешку с обычными.
Можно делать более хитро на компуте, складывая едж-пиксели в один линейный буфер, а остальные в другой, и потом запуская потоки на те и другие по очереди. Делал подобное, но довольно давно, уже плохо помню - оставлял заметки здесь (там же много ссылок на хорошие доки).

11 янв. 2019, 10:49 (Правка: 10:54)

#11

Mr F
> Глянь старую доку по крайзису3
Ага, глянул, спасибо. Это практически то же самое, что в демке NVidia.
Mr F
> В твоём случае можно рисовать сами декали два раза - вне еджей (как обычно) и
> на еджах (цикл и усреднение).
Цикл не нужен. SV_SampleIndex запустит пиксельный шейдер для каждого сабсемпла (sample frequency). Усреднение при резолве произойдет.
С этим вроде бы все понятно.
А как дальше быть? Вот у меня есть MSAA-текстура с декалями. Как ее использовать в основном шейдере? Сначала надо порезолвить и в основном шейдере семплить как обычную?

11 янв. 2019, 11:12

#12

Bonus
> Цикл не нужен
Bonus
> А как дальше быть? Вот у меня есть MSAA-текстура с декалями.
Цикл как раз = самодельный ресолв (только на еджах) с рисованием сразу в обычную, не MSAA текстуру.

11 янв. 2019, 11:15

#13

Mr F
> Цикл как раз = самодельный ресолв (только на еджах) с рисованием сразу в
> обычную, не MSAA текстуру.
Хм, да, по памяти так будет лучше, спасибо.

11 янв. 2019, 11:25

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