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

Deferred Decals + MSAA

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

#0
0:41, 11 янв. 2019

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


#1
1:45, 11 янв. 2019

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

#2
7:27, 11 янв. 2019

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

#3
7:29, 11 янв. 2019

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

#4
7:36, 11 янв. 2019

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

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

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

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

#6
10:16, 11 янв. 2019

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

#7
10:18, 11 янв. 2019

https://developer.nvidia.com/gameworksdownload

#8
10:28, 11 янв. 2019

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

#9
10:43, 11 янв. 2019

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

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

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

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

#11
11:12, 11 янв. 2019

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

#12
11:15, 11 янв. 2019

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

#13
11:25, 11 янв. 2019

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

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