Frustum Culling的“雷达方法”:首次简单测试失败?

时间:2013-03-07 02:36:08

标签: opengl go frustum culling rendering-engine

尝试至少让非常简单 part 1 of the Lighthouse3D Radar Frustum Culling tutorial正常工作......我绝对感到困惑的是,我甚至无法在渲染器中使用该部分。

所以第一步是:你测试一个点是在近平面前面还是在远平面后面,如果是这样的话就进行早期剔除。 (如果不是,那么你会进行进一步的测试,但我只是坚持第一部分。)

我使用2x2立方体的世界空间中心(x1y2z3)并且有一个可以自由移动和旋转的相机。所有我的矢量和矩阵的东西必须相当坚固,因为渲染器否则工作得很好。所以这是我对第一部分的看法(在Go中),简单的“Z vs near-or-far”测试:

func (cam *Camera) frustumHasPoint(point *Vec3) bool {
    var pc Vec3
    v := point.Sub(&cam.Controller.Pos)  // point minus camPos
    ref := cam.Controller.dir  // take a copy of camDir
    ref.Z = -ref.Z
    ref.Normalize() // camDir was already normalized but anyway...
    pc.Z = v.Dot(&ref)
    if pc.Z > cam.Perspective.ZFar || pc.Z < cam.Perspective.ZNear {
        return false
    }
    return true
}

现在我为什么要反转ref的Z?因为在教程中他们写道:“请注意,图中的参考不是右手系统(如在OpenGL中),因为Z的方向已被颠倒以使教程更直观” - 好吧,在GL教程中当然这有相反的效果......

如果如上所述反转Z,它会在50%的时间内剔除超过它的时间;如果我不这样做,那么大约98%的时间都会“过度剔除”..

我错过了什么?

1 个答案:

答案 0 :(得分:1)

解决。原因是大脑出现故障......教程清楚地写了关于首先用x / y / z轴来描述截头锥,不知何故我错过了..