Я хочу расширить ответ @ ybungalobill :
Деление z_clip / w_clip
не является строго необходимым, если единственной причиной будет сопоставление ближних и дальних плоскостей с конкретными значениями в NDC(-1 и 1 для соглашений GL по умолчанию).Если бы деление не было выполнено, мы могли бы использовать другую третью строку в матрице проекции, которая в основном могла бы просто реализовать масштаб и смещение, поэтому простая линейная функция.
Ноиспользование деления фактически позволяет линейную интерполяцию z
в пространство экрана .
Если вы не выполните деление на z
, вы математически преобразуете данные таким образом, что треугольник будет изогнут в измерении z: (если только он не параллеленплоскость изображения).Подумайте об этом: если у вас есть какой-то треугольник, который простирается в глубину, искажение перспективы будет иметь эффект, что точка, которая находится точно в центре 2D-проекции, будет , а не изображением центральной точкив реальном 3D-вводе.
Если вы выполните фактическое z/w
деление, вы получите гиперболическое отображение из пространства глаз z
в пространство окна z
, но тогда это может быть линейно интерполировано - примитивы остаются плоскими.
Вот вид сверху и снизу для обоих окон:
Линии на изображении должны представлять прямоугольники (или треугольники) в 3D.Один из них, центральная точка отмечена.Из-за деления перспективы на x
и y
эта центральная точка отображается намного ближе к конечной точке в 2D-изображении. Но если вы удерживаете z
линейно, то в окне Windows z
значение этой точки будетпо-прежнему будет на уровне 50% между началом и концом z
- что больше не будет по прямой линии.
Делая также перспективное деление на z
, вы также переместите значение z
намного ближе к конечной точке - именно на эту величину, чтобы она лежала на прямой линии.
Поскольку мы хотим провести очень высокооптимизированный тест глубины в аппаратном обеспечении, мы можем эффективно рассчитать глубину для примитива в любомточка на экране очень важна.Например, иерархический Z-тест (он же Hi-Z ) попытается отклонить части примитива для полной плитки пикселей, и для этого,вычисление максимального или минимального z
значения, которое примитив имеет внутри этой конкретной плитки гораздо эффективнее, если значение глубины можно интерполировать линейно.