From d2aabc29cd0cbbc52110a61b11d0dd5a093c3468 Mon Sep 17 00:00:00 2001 From: Mouse Date: Thu, 15 Aug 2019 22:00:14 +0800 Subject: [PATCH] Translated chapter 25 --- docs/25-optimizations-frustum-culling.md | 182 +++++++++++++++++++++++ docs/_static/25/bounding_sphere.png | Bin 0 -> 15303 bytes docs/_static/25/distance_to_plane.png | Bin 0 -> 10072 bytes docs/_static/25/plane.png | Bin 0 -> 6589 bytes docs/_static/25/view_frustum_i.png | Bin 0 -> 27906 bytes docs/_static/25/view_frustum_ii.png | Bin 0 -> 16817 bytes mkdocs.yml | 1 + 7 files changed, 183 insertions(+) create mode 100644 docs/25-optimizations-frustum-culling.md create mode 100644 docs/_static/25/bounding_sphere.png create mode 100644 docs/_static/25/distance_to_plane.png create mode 100644 docs/_static/25/plane.png create mode 100644 docs/_static/25/view_frustum_i.png create mode 100644 docs/_static/25/view_frustum_ii.png diff --git a/docs/25-optimizations-frustum-culling.md b/docs/25-optimizations-frustum-culling.md new file mode 100644 index 0000000..2db870a --- /dev/null +++ b/docs/25-optimizations-frustum-culling.md @@ -0,0 +1,182 @@ +# 优化 - 截锥剔除 (Optimizations - Frustum Culling) + +## 优化 - 截锥剔除一 + +现在我们使用了许多不同的图形效果,例如灯光、粒子等。此外,我们还学习了如何实例化渲染,以减少绘制许多相似对象的开销。然而,我们仍有足够的空间进行一些简单的优化,这将增加可以达到的帧率(FPS)。 + +你可能想知道为什么我们会在每一帧中绘制整个游戏项列表,即使其中一些项不可见(因为它们在摄像机后面或距离摄像机太远)。你甚至可能认为这是由OpenGL自动处理的,这在某种程度上是正确的。OpenGL将放弃位于可见区域之外的顶点的渲染,这称作裁剪(Clipping)。裁剪的问题是,在执行顶点着色之后,按顶点进行处理的。因此,即使此操作节省了资源,我们也可以通过不尝试渲染不可见的对象来提高效率。我们不会通过将数据发送到GPU以及对这些对象的每个顶点进行变换来浪费资源。我们需要移除不包含在视锥体(View Frustum)中的对象,也就是说,我们需要进行截锥剔除。 + +但是,首先让我们回顾一下什么是视锥体。视锥体是一个结合摄像机的位置和旋转以及使用的投影,包含所有可见物体的体积。通常,视锥体是一个四棱台,如下图所示: + +![视锥体I](_static/25/view_frustum_i.png) + +如你所见,视锥体由六个平面定义,位于视锥体之外的任何内容都不会渲染。因此,截锥剔除是移除视锥体之外的对象的过程。 + +因此,为了进行截锥剔除,我们需要: + +* 使用观察和投影矩阵中包含的数据计算截锥平面。 + +* 对每个游戏项检查它是否包含在视锥体中,换句话说,在大小截锥平面之间。并从渲染流程中删除那些不包含在其中的。 + +![视锥体II](_static/25/view_frustum_ii.png) + +那么让我们从计算截锥平面开始。平面由包含在其中的点和与该平面正交的向量定义,如下图所示: + +![平面](_static/25/plane.png) + +平面方程的定义如下: + +$$Ax+By+Cz+D=0$$ + +因此,我们需要计算视锥体的六个侧面的六个平面方程。为了达成这个目标,你基本上有两个选项。你可以进行繁琐的计算,得到六个平面方程的来自上述方程的四个常数(A、B、C和D)。另一个选项是让[JOML](https://github.com/JOML-CI/JOML "JOML")库为你计算这个值。通常情况下,我们选择后一个选项。 + +让我们开始编码吧。我们将创建一个名为`FrustumCullingFilter`的新类,跟它的名字相同,它将根据视锥体执行筛选操作。 + +```java +public class FrustumCullingFilter { + + private static final int NUM_PLANES = 6; + + private final Matrix4f prjViewMatrix; + + private final Vector4f[] frustumPlanes; + + public FrustumCullingFilter() { + prjViewMatrix = new Matrix4f(); + frustumPlanes = new Vector4f[NUM_PLANES]; + for (int i = 0; i < NUM_PLANES; i++) { + frustumPlanes[i] = new Vector4f(); + } + } +``` + +`FrustumCullingFilter`类也将有一个方法来计算平面方程,名为`updateFrustum`,它将在渲染之前调用。方法定义如下: + +```java +public void updateFrustum(Matrix4f projMatrix, Matrix4f viewMatrix) { + // 计算投影观察矩阵 + prjViewMatrix.set(projMatrix); + prjViewMatrix.mul(viewMatrix); + // 获取视锥体平面 + for (int i = 0; i < NUM_PLANES; i++) { + prjViewMatrix.frustumPlane(i, frustumPlanes[i]); + } +} +``` + +首先,我们储存投影矩阵的副本,并将其与观察矩阵相乘,得到投影观察矩阵。然后,使用这个变换矩阵,我们只需要为每个截锥平面调用`frustumPlane`方法。需要注意的是,这些平面方程是用世界坐标表示的,所以所有的计算都要在这个空间中进行。 + +现在我们已经计算了所有平面,我们只需要检查`GameItem`实例是否在截锥体中。该怎么做?让我们首先确认一下如何检查一个点是否在截锥体内,可以通过计算点到每个平面的有符号的距离来实现这一点。如果点到平面的距离是正的,这意味着点在平面的前面(根据其法线)。如果是负的,则意味着点在平面的后面。 + +![到平面的距离](_static/25/distance_to_plane.png) + +因此,如果到截锥的所有平面的距离为正,则一个点位于视锥体的内部。点到平面的距离定义如下: + +$距离=Ax_{0}+By_{0}+Cz_{0}+D$,其中$x_{0}$、$y_{0}$和$z_{0}$是点的坐标。 + +因此,如果$Ax_{0}+By_{0}+Cz_{0}+D <= 0$则点在平面的后面。 + +但是,我们没有点,只有复杂的网格,我们不能仅仅用点来检查一个物品是否在截锥体内。你可以考虑检查`GameItem`的每个顶点,看看它是否在截锥体内。如果任何一个点在里面,游戏项应该被绘制出来。但这就是OpenGL在裁剪时所做的,也是我们要避免的。记住,网格越复杂,截锥剔除的好处越明显。 + +我们需要把每一个`GameItem`放到一个简单的体中,这个体很容易检查。这里我们有两个选项: + +* 边界盒(Bounding Box)。 + +* 边界球(Bounding Sphere)。 + +在本例中,我们将使用球体,因为这是最简单的方法。我们将把每一个游戏项放在一个球体中,并检查球体是否位于视锥体中。为了做到它,我们只需要球体的中心和半径。检查它几乎等同于检查点,但是我们需要考虑板甲。如果满足以下条件,则球体将位于截锥之外:$距离=Ax_{0}+By_{0}+Cz_{0} <= -半径$。 + +![边界球](_static/25/bounding_sphere.png) + +因此,我们将在`FrustumCullingFilter`类中添加一个新方法来检查球体是否在截锥中。方法的定义如下: + +```java +public boolean insideFrustum(float x0, float y0, float z0, float boundingRadius) { + boolean result = true; + for (int i = 0; i < NUM_PLANES; i++) { + Vector4f plane = frustumPlanes[i]; + if (plane.x * x0 + plane.y * y0 + plane.z * z0 + plane.w <= -boundingRadius) { + result = false; return result; + } + } + return result; +} +``` + +然后,我们将添加过滤视锥体外的游戏项的方法: + +```java +public void filter(List gameItems, float meshBoundingRadius) { + float boundingRadius; + Vector3f pos; + for (GameItem gameItem : gameItems) { + boundingRadius = gameItem.getScale() * meshBoundingRadius; + pos = gameItem.getPosition(); + gameItem.setInsideFrustum(insideFrustum(pos.x, pos.y, pos.z, boundingRadius)); + } +} +``` + +我们在`GameItem`类中添加了一个新的属性`insideFrustum`来跟踪可见性。如你所见,边界球的板甲作为参数传递。这是由于边界球与`Mesh`管理,它不是`GameItem`的属性。但是,请记住,我们必须在世界坐标中操作,并且边界球的半径将在模型空间震。我们将应用为`GameItem`设置的比例将其转换为世界空间,我们还假设`GameItem`的位置是球体的中心(在世界空间坐标系中)。 + +最后一个方法只是一个实用方法,它接受网格表并过滤其中包含的所有`GameItem`实例: + +```java +public void filter(Map> mapMesh) { + for (Map.Entry> entry : mapMesh.entrySet()) { + List gameItems = entry.getValue(); + filter(gameItems, entry.getKey().getBoundingRadius()); + } +} +``` + +就这样。我们可以在渲染流程中使用该类,只需要更新截锥平面,计算出哪些游戏项是可见的,并在绘制实例网格和非实例网格时过滤掉它们: + +```java +frustumFilter.updateFrustum(window.getProjectionMatrix(), camera.getViewMatrix()); +frustumFilter.filter(scene.getGameMeshes()); +frustumFilter.filter(scene.getGameInstancedMeshes()); +``` + +你可以启用或禁用过滤功能,并可以检查你可以达到的FPS的增加和减少。在过滤时不考虑粒子,但是添加它是很简单的。对于粒子,在任何情况下最好检查发射器的位置,而不是检查每个粒子。 + +# 优化 - 截锥剔除二 + +解释了截锥剔除的基础,我们可以使用[JOML](https://github.com/JOML-CI/JOML "JOML")库中提供的更精细的方法。它特别地提供了一个名为`FrustumIntersection`的类,该类以按此[文章](http://gamedevs.org/uploads/fast-extraction-viewing-frustum-planes-from-world-view-projection-matrix.pdf "paper")所述的一种更有效的方式获取视锥体的平面。除此之外,该类还提供了测试边界盒、点和球体的方法。 + +那么,让我们修改`FrustumCullingFilter`类。属性和构造函数简化如下: + +```java +public class FrustumCullingFilter { + + private final Matrix4f prjViewMatrix; + + private FrustumIntersection frustumInt; + + public FrustumCullingFilter() { + prjViewMatrix = new Matrix4f(); + frustumInt = new FrustumIntersection(); + } +``` + +`updateFrustum`方法只是将平面获取委托给`FrustumIntersection`实例: + +```java +public void updateFrustum(Matrix4f projMatrix, Matrix4f viewMatrix) { + // 计算投影识图矩阵 + prjViewMatrix.set(projMatrix); + prjViewMatrix.mul(viewMatrix); + // 更新截锥相交类 + frustumInt.set(prjViewMatrix); +} +``` + +`insideFrustum`方法更简单: + +```java +public boolean insideFrustum(float x0, float y0, float z0, float boundingRadius) { + return frustumInt.testSphere(x0, y0, z0, boundingRadius); +} +``` + +使用该方法,你甚至可以达到更高的FPS。此外,还向`Window`类中添加了一个全局标记,以启用或禁用截锥剔除。`GameItem`类也有启用或禁用过滤的标记,因为对于某些项,截锥剔除过滤可能没有意义。 diff --git a/docs/_static/25/bounding_sphere.png b/docs/_static/25/bounding_sphere.png new file mode 100644 index 0000000000000000000000000000000000000000..27cc21e96ecb32a3f6c764922b61f18ff4843377 GIT binary patch literal 15303 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 PX23OF)2l^S93%e+bqhNr literal 0 HcmV?d00001 diff --git a/docs/_static/25/plane.png b/docs/_static/25/plane.png new file mode 100644 index 0000000000000000000000000000000000000000..ae7a47d71fd8011c00d91ff59662cd369b2bd637 GIT binary patch literal 6589 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 literal 0 HcmV?d00001 diff --git a/docs/_static/25/view_frustum_ii.png b/docs/_static/25/view_frustum_ii.png new file mode 100644 index 0000000000000000000000000000000000000000..f74291fdd58a418abafe47b329fb8ad55892a12d GIT binary patch literal 16817 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 literal 0 HcmV?d00001 diff --git a/mkdocs.yml b/mkdocs.yml index e47b415..1429ef8 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -23,6 +23,7 @@ nav: - 音效(Audio): 22-audio.md - 三维物体选取(3D Object Picking): 23-3d-object-picking.md - 回顾HUD - NanoVG(HUD Revisited - NanoVG): 24-hud-revisited.md +- 优化 - 截锥剔除 (Optimizations - Frustum Culling) : 25-optimizations-frustum-culling.md site_name: Lwjglbook中文翻译 site_author: Mouse0w0