【问题标题】:Omit off-screen triangles省略屏幕外三角形
【发布时间】:2015-06-04 05:23:00
【问题描述】:

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

【问题讨论】:

标签: java optimization 3d rendering rasterizing


【解决方案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

dot_product(vertex, plane) < constant_i.

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 包围整个剪辑矩形的多边形怎么样?看不到边缘。
    • @maaartinus:两个步骤:第一个考虑一个枢轴顶点并测试该顶点对多边形中所有其他顶点的边缘可见性。 2nd Choen-Sutherland 归结为位操作,对于行使用 OR 和 AND。但是您也可以通过 XOR-ing 测试围绕中心或涉及中心的循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多