{Horizon Culling} 地平线剔除

From : http://cesiumjs.org/2013/04/25/Horizon-culling/

在虚拟地球(如, Cesium)的开发过程中, 我们需要能够快速确定场景中的对象, 如地形瓦片(terrain tiles), 卫星(satellites), 建筑物(buildings), 交通工具(vehicles)等, 何时是不可见的。因为这些对象不可见, 所以也就没有必要被渲染。我们当然需要进行视域(view-frustum)的剔除。但是, 地平线剔除(horizon culling)是另一个重要的剔除类型。

在上图中, 绿色的点是观察者(viewer)是可见的。红色的点是不可见的,因为它们位与视域(两条白色的粗线中间的那部分区域)之外。蓝色的点虽然处于视域的范围内, 但它们依然是不可见的, 因为它们被地球遮挡住了。换句话说, 它们处于地平线之下。地平线剔除是一个非常浅显的一种思路: 你不需要去渲染那些相对当前观察者的位置处于地平线之下的对象。尽管听起来很简单易懂,细节的处理非常棘手, 尤其是这个过程要求得到非常快的处理。Cesium 需要对每个渲染帧做成千上万次的这种测试以确定地形瓦片的可见性。但, 这种测试是非常重要的。在上图的配置中,覆盖整个地球的地形瓦片都处于视域中。然而, 有一半以上的地形瓦片处于地平线以下,不需要被渲染。

几年前, Deron Ohlarik 写了两篇关于地平线剔除的非常优秀的文章。自此以来, 我们一直致力于扩展他的技术,我将在这里分享我们的成果。虽然它只适用于静态数据如地形瓦片,但我们发现这非常有用, 因为它比先前的技术处理地更快、更精确。对水平线剔除的精度的改善源于地球的椭球模型而非近似一个球面。

在此之前,我应该提到对这种技术的信心完全是因为我的同事——Frank Stoner. 我所做的贡献只是在 Cesium 中实现了它,以及写在这里,而他做了最艰难的工作是得到这种技术。

Horizon culling a point against a sphere

正如Ohlarik所描述的, 为了进行地平线剔除, 我们可以为一个静态对象(如一个地形瓦片),即便仅是一个点,计算一个边界范围。如果这个点处于地平线下以下,那么我们就能确信这个瓦片也处于地平线以下。我们的新技术限制于参照一个椭球来剔除单个点,因此我们开始假定这个被遮挡的点已经被计算过了。关于具体做法,请查看后续博客

我承诺,我们将实现参照一个一般椭球的水平剔除。我也会兑现这个诺言,但是让我们先从一个简单的单位球出发来介绍地平线剔除。然后, 我会说明如何将这个单位球推广到一个任意的椭球。考虑下面这幅图:

在上面这幅图中, 蓝色的圆就是我们的单位球。从相机位置引出的两条单位球的切线表示了视域。图中黑色的竖线表示了所有的地平线上的点。在我们的单位球面上,地平线上的点处在一个平面上,并形成了一个圆。从相机位置到所有地平线上的点的向量构成了一个无限延伸的圆锥体。

灰色阴影的部分球体以及它周围的空间表示了位于地平线以下的区域。阴影区域中的任何点从相机位置上来看,都是不可见的。直观地说,如果一个点处于正切向量构成的无限圆锥体内部并且位于地平线上所有点构成的平面的后面,那么这个点位于地平线之下。

The Plane test

首先, 让我们进行一项廉价的测试来确定一个点位于一个平面的那一侧。考虑下面的这幅图:

我们知道向量VC 和向量VT: 它们分别表示观察者到目标点和椭球中心的向量。我们也知道HC是个单位向量, 因为我们现在处理的是一个单位球。根据毕氏定理(Pythagorean theorem):

接下来,我们注意到三角形VCHHCP是相似三角形。它们共享一个点C的上的角,另外,它们都有一个90度的直角。因此:

因此, 观察者到地平面的距离是:

向量VT在向量VC上的投影小于||VP||目标点位于平面前侧。换句话说, 目标点位于地平面后侧当:

我们可以简化这个公式,通过两边同时乘以||VC||2, 结果变成:

为了确定目标点是否位于地平面后侧,取观察者到目标点的向量与观察者到椭球中心的向量的点积。如果得到的值比观察者到椭球中心的向量的大小平方值减1,那么目标点就位于该平面后侧。不需要进行平方根或三角函数运算。

The Cone Test

时间: 2024-07-31 22:14:46

{Horizon Culling} 地平线剔除的相关文章

1645: [Usaco2007 Open]City Horizon 城市地平线

1645: [Usaco2007 Open]City Horizon 城市地平线 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 315  Solved: 157[Submit][Status] Description Farmer John has taken his cows on a trip to the city! As the sun sets, the cows gaze at the city horizon and observe t

Occlusion Culling遮挡剔除理解设置和地形优化应用

这里使用的是unity5.5版本 具体解释网上都有,就不多说了,这里主要说明怎么使用,以及参数设置和实际注意点 在大场景地形的优化上,但也不是随便烘焙就能降低帧率的,必须结合实际情况来考虑,当然还有透明物体问题和动态物体的剔除等等都将详细说明. 首先说一下烘焙的关系 因为unity摄像机自带视椎剔除(Frustum Culling),所以如果都是动态物体,那么只有视椎剔除,可以在bake过后通过camera的occlusion culling里面的visualize看出,其实不baked话也是有

BZOJ1645 [Usaco2007 Open]City Horizon 城市地平线

本来想打线段树的说... 就是把坐标离散化了,然后区间最大求和即可... 后来觉得有点烦的说(silver题就要线段树...),于是看了下usaco的题解,发现了个高端的东西:善用STL里的容器和迭代器就可以了. 以下就是高端程序: 1 /************************************************************** 2 Problem: 1645 3 User: rausen 4 Language: C++ 5 Result: Accepted 6

BZOJ_1654_[Usaco2007 Open]City Horizon 城市地平线_扫描线

Description N个矩形块,交求面积并. Input * Line 1: A single integer: N * Lines 2..N+1: Input line i+1 describes building i with three space-separated integers: A_i, B_i, and H_i Output * Line 1: The total area, in square units, of the silhouettes formed by all

Unity 摄像机Clear Flags和Culling Mask属性用途详解

原文地址:http://blog.csdn.net/tanmengwen/article/details/8798231 1.简述两个属性 1.1 Clear Flags 清除标记 每个相机在渲染时会存储颜色和深度信息.屏幕的未绘制部分是空的,默认情况下会显示天空盒.当你使用多个相机时,每一个都将自己的颜色和深度信息存储在缓冲区中,还将积累大量的每个相机的渲染数据.当场景中的任何特定相机进行渲染时,你可以设定清除标记以清除缓冲区信息的不同集合.可以通过下面四个选项之一来完成: 1.Skybox

游戏编程精粹系列书籍目录一览

游戏编程精粹1 第1章 通用编程技术 1.0 神奇的数据驱动设计(Steve Rabin) 3 1.0.1 点子1--基础 3 1.0.2 点子2--最低标准 3 1.0.3 点子3--杜绝硬编码 3 1.0.4 点子4--将控制流写成脚本 4 1.0.5 点子5--什么时候不适合使用脚本? 5 1.0.6 点子6--避免重复数据 5 1.0.7 点子7--开发工具来生成数据 6 1.0.8 结论 6 1.1 面向对象的编程与设计技术(James Boer) 7 1.1.1 代码风格 7 1.1

Nvidia SDK11 之 PNPatches(细化算法技术学习)

PN-Triangles (也称作N-patches) 是比较流行的处理粗糙模型细分算法技术,PN-Triangles算法能够将低分辨率模型转化为弯曲表面,该表面然后可以被重新绘制成由"高精曲面细分"的三角形所组成的网格,经常借助于Tessellation (曲面细分) 技术创建外观更加平滑的模型. 在当今游戏中,我们认为理所当然的大量视觉假象都可以借助此类算法来消除.这些视觉假象包括人物关节处呈现块状图案.汽车轮子呈多边形外观以及面部特征粗糙. 图1 曲面细分技术 无需手工输入,PN

CSharpGL(31)[译]OpenGL渲染管道那些事

+BIT祝威+悄悄在此留下版了个权的信息说: 开始 自认为对OpenGL的掌握到了一个小瓶颈,现在回头细细地捋一遍OpenGL渲染管道应当是一个不错的突破口. 本文通过阅读.翻译和扩展(https://www.opengl.org/wiki/Rendering_Pipeline_Overview)的方式,来逐步回顾总结一下OpenGL渲染管道,从而串联起OpenGL的所有知识点,并期望能在更高的层次上有所领悟. 另外,(https://www.opengl.org/wiki/Rendering_

【Unity】4.6 灯光

分类:Unity.C#.VS2015 创建日期:2016-04-11 一.简介 灯光(Light,也叫光源)是每一个场景的重要组成部分,用于照亮场景和对象,从而让游戏具有自己的个性和风格,比如利用灯光可模拟太阳.燃烧的火柴光.手电筒.炮火或爆炸等. 网格模型和材质纹理决定了场景的形状和质感.灯光则决定了场景环境的明暗.色彩和氛围.每个场景中可以使用-个以上的灯光,合理地使用灯光可以创造完美的视觉效果. 在 Unity 专业版中,所有灯光都可以有选择地投射立方体贴图纹理.立方体贴图 (Cubema