我正在创建一个简单的小软件3D引擎。现在,如果所有顶点不在视锥之外,则多边形不会呈现,这一切都很好,直到您靠近多边形并且所有顶点都在屏幕外,但中间顶点仍在视锥内部但忽略了它无论如何。无论如何我都会尝试渲染它,但是我需要对其进行一些优化,这是我想到的第一个。

如果您不了解我要尝试传达的内容,请使用gif和问题的一些代码。

boolean v1Inside = v1.isInsideViewFrustum();
boolean v2Inside = v2.isInsideViewFrustum();
boolean v3Inside = v3.isInsideViewFrustum();
if (v1Inside && v2Inside && v3Inside) {
   rasterizeTriangle(v1, v2, v3);
   return;
}

if (!(v1Inside || v2Inside || v3Inside)) {
    return;
}

最佳答案

您可以实施保守的方法来进行视锥剔除,偶尔会产生误报(而不是误报)。如果所有顶点都落在某个视锥平面的错误一侧,则最典型的方法是拒绝三角形。

   a       b
A  |    B  |   C
 --+-------+-------  c
D  |       |   E
   |       |
---+-------+-------  d
F  |   G   |   H


在2D情况下,这里有四个剪切平面:a,b,c,d。
该方法拒绝完全在线/平面'c'上方,线'd'下方,线'a'左侧或线'b'右侧的三角形,而不是拒绝例如三角形。您在B,G和H段中的顶点情况。

这种透视图在透视投影后很容易实现,给出了简单的方程式: x0,x1,x2
dot_product(vertex, plane) < constant_i.

09-10 07:50
查看更多