0

我正在创建一个简单的小软件 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;
}

当所有顶点都离开屏幕时不渲染

4

2 回答 2

1

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

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

在二维情况下,有四个剪切平面:a、b、c、d。这种方法拒绝完全高于线/平面'c'、低于线'd'、线'a'的左侧或线'b'的右侧的三角形,不拒绝例如您在段B、G和H中的顶点情况.

这种剔除在透视投影后很容易实现,给出简单的方程:例如 x0,x1,x2 < -1,或者使用平截头体的平面方程:

dot_product(vertex, plane) < constant_i.
于 2015-06-04T05:42:50.497 回答
0

该问题的实际标准算法是Cohen-Sutherland Line Clipping 算法。它很容易扩展到凸多边形,因为如果它的任何边缘可见,那么这些都是可见的。

编辑:当涉及到多边形时,您必须测试围绕或涉及中心的循环。您可以使用 XOR 和辅助位掩码来做到这一点。一旦我找到了一个很好的参考,我会在这里添加这个。

于 2015-06-04T07:46:22.730 回答