W-буфер (инг) в Direct3D 12

В Документах D3D10 есть список, в котором показаны устаревшие функции от D3D9 до D3D10. В нем говорится, что W-буферизация больше не поддерживается, и вместо этого мы должны использовать высокоточные буферы глубины / Z-буферы. Я подозреваю, что он также не (полностью) поддерживается в Direct3D 11 и 12. Но есть ли способ использовать W-буферы в Direct3D 12?


person L1-Cache    schedule 24.04.2020    source источник


Ответы (1)


Функция «W-буферизация» в Direct3D 9 является частью устаревшего конвейера с фиксированными функциями. В Direct3D 10 и более поздних версиях можно использовать только программируемый конвейер шейдеров (или для DirectX 11+ конвейер шейдеров DirectCompute). Следовательно, аппаратная функция «w-buffering» не имеет значения. Это также было гораздо большей проблемой для оборудования эпохи Direct3D 9, когда люди использовали 16-битные буферы глубины.

В модели программируемых шейдеров ваши шейдеры должны вычислять значения глубины, используя либо обычные значения z, либо значения линеаризованной глубины, и устанавливать соответствующее состояние глубины/трафарета. Имейте в виду, что вам нужно использовать SV_DepthGreater или SV_DepthLessEqual вместо SV_Depth, чтобы не потерять оптимизацию «раннего отклонения z».

См. эту запись в блоге и этот пост за хорошее обсуждение темы.

TL;DR: большинство людей просто используют DXGI_FORMAT_D32_FLOAT и не беспокоятся об этом.

person Chuck Walbourn    schedule 24.04.2020
comment
Возникает ли Z-Fighting при использовании SV_Depth? - person L1-Cache; 28.04.2020
comment
Битва Z может произойти в любое время, когда у вас недостаточно точности в буфере глубины для настроек ближней/дальней плоскости. Это гораздо менее проблематично при использовании DXGI_FORMAT_D32_FLOAT вместо старых 16-битных форматов глубины. - person Chuck Walbourn; 28.04.2020