反向Opengl的裁剪算法?

时间:2011-04-21 19:41:24

标签: opengl

在opengl中我们有glClipPlane(),它采用Ax + + + Cz + D = 0形式的平面方程。我有6个这样的平面形成一个立方体。但是,我想展示外部世界,而不是在立方体中展示世界。例如,如果一个球体进入立方体内部,它应该被修剪但是当它出来时它不应该被修剪。 不确定但是这与在顺时针方向上绘制立方体面有关,所以正常情况会远离视图吗?

5 个答案:

答案 0 :(得分:3)

不幸的是,OpenGL剪辑平面的工作方式不可行。由于所有剪裁平面都应用于倒立方案例中的顶点,因此总会有至少3个剪裁平面。

OpenGL剪辑平面的这种特殊行为因此为您提供了一个重要约束:您只能剪切到凸区域。然而,“倒”立方体不是凸的:在数学术语中凸集是一个集合,对于集合的任何两个给定点,这些点之间的(最短)直线不在集合之外

答案 1 :(得分:1)

虽然我不熟悉opengl剪辑平面的精确工作方式,但我认为它与定义“剪辑”和“不剪辑”半空间有关 - 无论是否使用法向量(A,B) ,C)或类似的方式应该不是问题。

尝试在每个平面上翻转等式(-Ax -By -Cz -D = 0)。这应该翻转平面的方向(除非opengl使用完全不同的方法来确定空间和空间)。

答案 2 :(得分:0)

IvoDankolov确实提到翻转系数会改变裁剪的一侧,但是......每个额外的裁剪平面剪辑更多几何,它永远不会允许你限制前一个剪裁平面的范围

所以简而言之,你不能使用剪裁平面来做你想要的事情(除非你开始画几次你的几何体,并且一次使用一个剪辑平面,并处理透支。这是非常昂贵的)。

但是,您可以直接在片段着色器中计算每个片段是在多维数据集的内部还是外部,并相应地discard内部片段。这实质上意味着在片段着色器中实现剪辑。

答案 3 :(得分:0)

这有点像巴巴所建议的,但只有3次传球。它仍然有点贵,但你可以:

  1. 将立方体写入模板缓冲区
  2. 渲染未击中模板的所有内容(将内容绘制到多维数据集的两侧)
  3. 应用面向前方的剪裁平面(立方体背面的平面)
  4. 在模板缓冲区上渲染内容(仅在剪辑立方体后面绘制内容)
  5. 应用面向后方的剪裁平面(立方体的正面)
  6. 再次使用模板缓冲区渲染(完全在剪辑立方体前面的东西)
  7. 如果有第二个深度缓冲区,您可以将多维数据集的后面写入第二个深度缓冲区,并且只有在片段小于该值但是大于第一个深度缓冲区时才会渲染。然后,您可以将立方体的前面渲染到深度缓冲区中,然后在场景上进行第二次渲染,以在立方体前面渲染内容。

答案 4 :(得分:0)

我用于剪裁原始样本:GLdouble eqn1 [4] = {0.7,0.7,0.7,0.0}; 结果是: enter image description here

我用于剪切原始样本:GLdouble eqn1 [4] = {-0.7, - 0.7,-0.7,0.0}; 结果是:

enter image description here

因此您可以使用负数a,b,c,d来显示多维数据集的每一面