opengl - "Radar approach"到视锥体剔除 : fail at first simple test?

标签 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% 的时间内“过度剔除”..

我错过了什么?

最佳答案

已解决。原因是脑部故障...教程清楚地写了关于首先获取 x/y/z 轴来描述平截头体,不知何故我错过了......

关于opengl - "Radar approach"到视锥体剔除 : fail at first simple test?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15262048/

相关文章:

c++ - 什么是 Glew、Glut 和 glfw3?哪些在 Opengl 3/4 中已被弃用

opengl - OpenGL 着色器可以访问渲染前设置的哪些值?

go - 使用 fmt.Printf 向数字添加零填充

c++ - 用于桌面 VR 的 OpenGL 非对称截锥体

c++ - 边界框视锥体渲染 - 距离渲染 - OpenGL

c++ - 三次贝塞尔曲线交互

c++ - OpenGL 白色空白屏幕且无响应

go - 用 Go 练习 BDD

go - net/http 不适用于 ipv6 地址