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