Jak interpolować wierzchołki podczas obcinania?

Aug 16 2020

Kiedy przycinamy w jednorodnej przestrzeni przycinania, musimy wygenerować nowy wierzchołek znajdujący się na przecięciu krawędzi i płaszczyzny przycięcia. W związku z tym musimy interpolować plik$(x , y, z , w)$położenie obu wierzchołków, aby wygenerować nową pozycję wierzchołka. Wydaje się, że wszystko jest w porządku, ale co powinienem zrobić, gdy wygenerowany wierzchołek po interpolacji ma aw równy 0?

To nie działa, ponieważ dzielenie w powoduje, że punkt idzie do nieskończoności (dzielenie przez zero).

Czy powinienem więc upewnić się, że nigdy nie generuję wierzchołków z aw równym 0 (jak?)? Czy powinienem po prostu poradzić sobie z null w (jak?)?

Można powiedzieć, że taka sytuacja nigdy się nie zdarzy, ale faktycznie się zdarza, zwłaszcza gdy z wierzchołków jest ustawiony na ich w, na przykład dla skyboxów. W tym przypadku, kiedy przycinamy do najbliższej płaszczyzny (z = 0 w przestrzeni obcinania) i interpolujemy pozycję, otrzymamy az równy 0, ale także aw równy 0 ...

Odpowiedzi

2 NathanReed Aug 30 2020 at 07:12

Punkty przed aparatem mają $w > 0$ściśle, z definicji. Powiedziałbym, że jeśli obcinanie daje ci punkty$w = 0$ wtedy coś jest nie tak.

Rozważ lewą / prawą / górną / dolną płaszczyznę przycinania. Nie ma możliwości, aby trójkąt rozciągał się od części widocznej ściętej krawędzi do$w = 0$ płaszczyzna kamery lub za nią, bez przechodzenia poza jedną z bocznych płaszczyzn ściętych - lub bliższą płaszczyznę, która leży w pewnej dodatniej odległości $w_\text{near} > 0$.

Wspomniałeś o skyboxach i otoczeniu $z = w$w danych wyjściowych Vertex Shader. Taka geometria musi przecinać boczne płaszczyzny ściętego stożka, zanim będzie mogła dostać się do najbliższej płaszczyzny. (W jaki sposób część skyboxa może zbliżyć się na tyle blisko kamery, że może zostać przycięta tylko przez najbliższą płaszczyznę?) Jeśli prawidłowo przycinasz ją do wszystkich płaszczyzn ściętych, musisz skończyć z$w > 0$ w ostatnim wierzchołku.