Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Хитрая запись глубины при рендеринге

Хитрая запись глубины при рендеринге

Поделиться

Страницы: 1 2 Следующая

SuslikМодераторwww9 ноя. 20175:52#0
Дано некоторое текущее состояние буфера глубины. Требуется отрендерить меш таким образом, чтобы в глубину каждого фрагмента, который прошёл depth test, записалась бесконечность, а те, которые тест глубины не прошли, остались без изменения.

Сейчас делаю примерно так:

//curr_depth : SV_DEPTH
float ref_depth = texture2D(depth_sampler, screen_coord.xy);
if(curr_depth < ref_depth)
{
  curr_depth = 1.0f; //1.0f — бесконечная глубина
}else
{
  discard;
}
очевидно, моё текущее решение требует копирования текущего состояния буфера глубины в промежуточную текстуру depth_sampler, чего хотелось бы избежать. Требуется решение для уровня железа d3d9 и d3d11. Допускается использовать умеренные хаки и полунедокументированные штуки. Например, буфер глубины имеет тип INTZ, который сам по себе не является документированным, но работает везде.

MrShoorУчастникwww9 ноя. 20176:11#1
Suslik
Можно стенсил подцепить. И если у тебя данных пишется не много от всей картинки, то будет выйгрыш по филлрейту.
SuslikМодераторwww9 ноя. 20176:19#2
MrShoor
ну вот записал я в стенсил. дальше с ним что делать? мне нужно численно получить бесконечности в depth buffer'е на месте отрендеренных фрагментов.
kasПостоялецwww9 ноя. 20177:23#3
Нарисовать квад с бесконечной глубиной там где стенсиль помаркал?
MrShoorУчастникwww9 ноя. 20177:26#4
Suslik
> ну вот записал я в стенсил. дальше с ним что делать? мне нужно численно
> получить бесконечности в depth buffer'е на месте отрендеренных фрагментов.
kas верно ответил. Рисовать фуллскрин квад.
Panzerschrek[CN]Участникwww9 ноя. 20177:28#5
Suslik
> Требуется отрендерить меш таким образом, чтобы в глубину каждого фрагмента,
> который прошёл depth test, записалась бесконечность,

Ты случаем не порталы или зеркала запиливаешь?

SuslikМодераторwww9 ноя. 20177:29#6
kas
> стенсиль
не нравится. придётся ограничивать себя форматом буфера глубины, который поддерживает стенсил.

Panzerschrek[CN]
> Ты случаем не порталы или зеркала запиливаешь?
случаем нет.

Правка: 9 ноя. 2017 7:30

MrShoorУчастникwww9 ноя. 20177:49#7
Suslik
Есть еще решение, но только на железе D3D11. На фрагментный шейдер ставить [earlydepthstencil] и во фрагментном шейдере писать в глубину 0. Вторым проходом рисовать фуллскрин квад, и все 0.0f превращать в 1.0f. Недостатки: 1. требует sm50. 2. ноль в буфере глубины получается зарезервированным под нужды данного алгоритма.

Правка: 9 ноя. 2017 7:58

MrShoorУчастникwww9 ноя. 20177:53#8
Suslik
> придётся ограничивать себя форматом буфера глубины, который поддерживает
> стенсил.
Вроде стенсил есть и для 24 бит, и для 32. Из буферов глубины без стенсила остается только D16f.
kasПостоялецwww9 ноя. 20177:55#9
Suslik
> не нравится. придётся ограничивать себя форматом буфера глубины, который
> поддерживает стенсил.
ну ограничивай себя копированием глубины и ифом, тут какбы никто не настаивает - дело хозяйское
MrShoorУчастникwww9 ноя. 20178:03#10
Кстати стенсил не обязателен. Подойдет любой color буфер, потипу DXGI_FORMAT_R8_UNORM. Просто первым проходом пишешь в него единичку там где тест проходит. Вторым проходом рисуешь фулскрин квад, и как со стенсилом, где единичка, там пишешь в глубину 1.
MikleМодераторwww9 ноя. 20179:03#11
MrShoor
> Кстати стенсил не обязателен. Подойдет любой color буфер
Или альфаканал текущего колорбуфера.

Правка: 9 ноя. 2017 9:03

kasПостоялецwww9 ноя. 20179:08#12
Текстурой маскировать будет думаю даже медленней чем первоначальный вариант
MrShoorУчастникwww9 ноя. 20179:14#13
kas
> Текстурой маскировать будет думаю даже медленней чем первоначальный вариант
Стенсилом тоже не быстро. Все зависит от количества пикселей, которые надо будет закрасить.
kasПостоялецwww9 ноя. 20179:31#14
Стенсилом думаю быстрее всего из текущих вариантов. Значительно быстрее маски по крайне мере

Страницы: 1 2 Следующая

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

2001—2017 © GameDev.ru — Разработка игр