Применять разделение перспективы только по x и y? - PullRequest
0 голосов
/ 21 апреля 2019

При выводе матрицы перспективы значение z смещается к значению w

shifting z-value to w-value

, так что когда к результату применяется деление перспективыматричного умножения со значениями положения, значение z может быть сохранено.

perspective divide

Почему аппаратное обеспечение не может просто применить z-деление наТолько значения x и y?

Это сэкономит несколько дополнительных вычислений, выполняемых при рендеринге конвейера, таких как смещение w-значения в z-значение, компенсация третьей строки матрицы перспективы с дополнительным z-умножением, потому чтов конечном итоге он будет разделен на значение z и т. д.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2019

Я хочу расширить ответ @ ybungalobill :

Деление z_clip / w_clip не является строго необходимым, если единственной причиной будет сопоставление ближних и дальних плоскостей с конкретными значениями в NDC(-1 и 1 для соглашений GL по умолчанию).Если бы деление не было выполнено, мы могли бы использовать другую третью строку в матрице проекции, которая в основном могла бы просто реализовать масштаб и смещение, поэтому простая линейная функция.

Ноиспользование деления фактически позволяет линейную интерполяцию z в пространство экрана .

Если вы не выполните деление на z, вы математически преобразуете данные таким образом, что треугольник будет изогнут в измерении z: (если только он не параллеленплоскость изображения).Подумайте об этом: если у вас есть какой-то треугольник, который простирается в глубину, искажение перспективы будет иметь эффект, что точка, которая находится точно в центре 2D-проекции, будет , а не изображением центральной точкив реальном 3D-вводе.

Если вы выполните фактическое z/w деление, вы получите гиперболическое отображение из пространства глаз z в пространство окна z, но тогда это может быть линейно интерполировано - примитивы остаются плоскими.

Вот вид сверху и снизу для обоих окон:

top down view of eye space and window space for hyperbolical and linear depth values

Линии на изображении должны представлять прямоугольники (или треугольники) в 3D.Один из них, центральная точка отмечена.Из-за деления перспективы на x и y эта центральная точка отображается намного ближе к конечной точке в 2D-изображении. Но если вы удерживаете z линейно, то в окне Windows z значение этой точки будетпо-прежнему будет на уровне 50% между началом и концом z - что больше не будет по прямой линии.

Делая также перспективное деление на z, вы также переместите значение zнамного ближе к конечной точке - именно на эту величину, чтобы она лежала на прямой линии.

Поскольку мы хотим провести очень высокооптимизированный тест глубины в аппаратном обеспечении, мы можем эффективно рассчитать глубину для примитива в любомточка на экране очень важна.Например, иерархический Z-тест (он же Hi-Z ) попытается отклонить части примитива для полной плитки пикселей, и для этого,вычисление максимального или минимального z значения, которое примитив имеет внутри этой конкретной плитки гораздо эффективнее, если значение глубины можно интерполировать линейно.

1 голос
/ 21 апреля 2019

Показанная вами матрица перспективы будет правильно проецировать вершины на плоскость 2D-изображения, но она потеряет информацию о глубине. Последнее необходимо для правильной Z-буферизации. Помните, что z ndc сравнивается и сохраняется в буфере глубины.

Поэтому для правильного удаления скрытой поверхности необходима третья координата, и правильная перспективная матрица будет

*  *  *  *
*  *  *  *
0  0  C  D
0  0  -1 0

где C = - (f + n) / (f - n) и D = - 2fn / (f - n) . Здесь f и n - это дальние и ближние плоскости отсечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...