OpenGL投影裁剪

Posted

技术标签:

【中文标题】OpenGL投影裁剪【英文标题】:OpenGL projection clipping 【发布时间】:2012-08-13 20:33:43 【问题描述】:

例如,如果我们有正射投影:

left = -aspect, right = aspect, top = 1.0, bottom = -1.0, far = 1.0, near = -1.0

并且将在-2.0处绘制三角形,它将被近剪裁平面切割。它真的会节省一些宝贵的渲染时间吗?

剔除决定我们是否需要绘制某些东西,如果超出我们的视野则丢弃(由程序员在顶点着色器/主程序中编写)。裁剪 == 廉价的自动剔除?

也只是在廉价剔除的主题 - 将是

if(dist(cam.pos, sprite.pos) < MAX_RENDER_DIST)
draw_sprite(sprite);

只够简单的 2d 游戏吗?

【问题讨论】:

【参考方案1】:

对于 x、y 和 z,默认 OpenGL 裁剪空间为 -1 到 +1。

精灵距离的条件测试将起作用。这有点不需要,因为远剪裁平面几乎可以做同样的事情。通常它已经足够好了。在某些情况下需要进行测试。剪切平面内拐角处的对象可能会随着相机转动而超出远剪切平面。原因是相机到角点的距离比相机到远剪裁平面的垂直距离长。如果您有 2D 游戏并且不允许更改摄像机视角,这不是问题。

如果您有一个简单的 2D 游戏,您很有可能不需要担心图形优化。如果您在剪裁平面之外绘制精灵,您可以节省时间。但是你节省多少时间取决于。如果大量精灵在外面,您可以节省大量时间。但是,您可能应该考虑使用什么算法,而不是绘制无论如何都不会显示的东西。如果只有一小部分精灵在外面,那么节省的时间将可以忽略不计。

【讨论】:

【参考方案2】:

GPU 中的裁剪问题在于它发生在 pipeline 中相对较晚,就在光栅化之前,所以很多计算可能已经白费了。

在 CPU 上执行可以避免这些计算的发生,而且非常重要的是,可以减少实际绘制命令的数量(这也可能是一个瓶颈)。

但是,您确实希望在 CPU 中快速执行此操作,通常您会使用 octree 或类似名称来表示数据,这样您就可以一次丢弃整个子树。如果您必须单独检查每个多边形甚至对象,这可能会变得很昂贵。

因此,总而言之:有用性取决于您的瓶颈所在(cpu、顶点着色器、传输速率……)。

【讨论】:

以上是关于OpenGL投影裁剪的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL中的投影与变换的案例说明详细!(几何变换=>投影变换=>裁剪=>视口变换,包含常用的函数!)

[OpenGL](翻译+补充)投影矩阵的推导

[OpenGL](翻译+补充)投影矩阵的推导

OpenGL投影矩阵(Projection Matrix)构造方法

OpenGL中的三维裁剪

OpenGL-坐标系