Как интерполировать вершины при обрезке?

Aug 16 2020

Когда мы выполняем обрезку в однородном пространстве обрезки, мы должны создать новую вершину, расположенную на пересечении края и плоскости обрезки. Таким образом, мы должны интерполировать$(x , y, z , w)$положение обеих вершин для создания новой позиции вершины. Вроде все хорошо, но что мне делать, если у сгенерированной вершины после интерполяции aw = 0?

Это не работает, потому что деление на w заставляет точку уходить в бесконечность (деление на ноль).

Так следует ли мне гарантировать, что я никогда не создаю вершины с aw, равным 0 (как?)? Или мне просто нужно иметь дело с нулевым w (как?)?

Вы можете сказать, что такой ситуации никогда не бывает, но на самом деле это происходит, особенно когда z вершин установлен на их w, например для скайбоксов. В этом случае, когда мы отсекаем ближнюю плоскость (z = 0 в пространстве отсечения) и интерполируем положение, мы получим az, равный 0, но также aw, равный 0 ...

Ответы

2 NathanReed Aug 30 2020 at 07:12

Точки перед камерой имеют $w > 0$строго по определению. Я бы сказал, что если отсечение дает вам очки с$w = 0$ тогда что-то идет не так.

Рассмотрим левую / правую / верхнюю / нижнюю плоскости зажима. Треугольник не может простираться от части видимой усеченной кости до$w = 0$ плоскость камеры или позади нее, не пересекая при этом одну из боковых плоскостей усеченного конуса, или же ближнюю плоскость, которая находится на некотором положительном расстоянии $w_\text{near} > 0$.

Вы упомянули скайбоксы и настройку $z = w$в выводе вершинного шейдера. Такая геометрия должна пересекать боковые плоскости усеченного конуса, прежде чем сможет добраться до ближней плоскости. (Как может часть скайбокса приблизиться к камере достаточно близко, чтобы быть обрезанной только ближней плоскостью?) Если вы правильно отсекаете ее по всем плоскостям усеченной кости, вы должны в конечном итоге получить$w > 0$ в последней вершине.