В Документах D3D10 есть список, в котором показаны устаревшие функции от D3D9 до D3D10. В нем говорится, что W-буферизация больше не поддерживается, и вместо этого мы должны использовать высокоточные буферы глубины / Z-буферы. Я подозреваю, что он также не (полностью) поддерживается в Direct3D 11 и 12. Но есть ли способ использовать W-буферы в Direct3D 12?
W-буфер (инг) в Direct3D 12
Ответы (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
и не беспокоятся об этом.
DXGI_FORMAT_D32_FLOAT
вместо старых 16-битных форматов глубины.
- person Chuck Walbourn; 28.04.2020