问题标签 [culling]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1962 浏览

opengl - 截锥体剔除矩形问题

我正在尝试在我的 OpenGL 2d 游戏中实现截锥剔除。在这一点上,我的游戏中唯一的几何对象是矩形,所以我认为这很容易,但我得到了意想不到的结果。我已经设置了一个对称的透视投影,其视场角为 45 度,近平面和远平面分别为 0.01 和 50。眼睛矢量始终平行于 z 轴,相机只能沿 x 和 y 轴移动。

我的想法是在我试图剔除的矩形的 z 坐标处获取相机当前可见的世界空间的矩形区域。因为相机正在看平截头体的中心,所以我计算到这个可见矩形区域边缘的距离如下:

然后我在相机的 x 和 y 坐标之间添加和减去这个距离,以获得最大和最小可见 x 和 y,然后测试给定的矩形以查看它是否在这些值之间。

我的问题是我在这里是否走在正确的轨道上,以及为什么当我在 z=5 有一个物体时,上面的公式返回一个小得离谱的值(某物 *10^-37),在 ( 0,0,0)?

0 投票
5 回答
13524 浏览

opengl - 3d 遮挡剔除

我正在用 C++/openGL 编写一个类似于 Minecraft 的静态 3d 块世界。我正在努力提高帧速率,到目前为止,我已经使用八叉树实现了截锥剔除。这有帮助,但我仍然看到中等到差的帧速率。下一步是剔除被更近的立方体隐藏在视点之外的立方体。但是,我还没有找到很多关于如何实现这一点的资源。

0 投票
2 回答
1825 浏览

graphics - 用于截锥体剔除的松散八叉树 - 需要一些建议

我正在为我的引擎中实现动态对象的截锥体剔除,并且一直在尽可能地阅读“松散的八叉树”。不幸的是,大多数消息来源都非常模糊,实际上只是很多人说他们有多好,他们给了 O(1) 插入和删除,但没有解释其背后的任何逻辑。

我理解八分圆被视为大于它们的主要原则,并且松散因子可以达到 2。这意味着可以根据对象的大小将对象插入单个节点。问题是很多文章没有使用 2 的“k 因子”(可能是为了获得更紧密的配合),因此失去了快速插入/删除;相反,它们保持邻接结构,因此您可以遍历给定深度的所有节点并使用每个节点测试对象的中心。

我只需要一个粗略的剔除测试,我希望有 O(1) 的插入时间,并制定了计算应插入对象的深度(级别)的公式。但是,我找不到任何文章讨论从对象的大小和位置计算精确节点的公式。

我是否完全误解了算法,我是否在寻找不可能的东西?如果有人可以向我指出任何好的论文或文章(我读过http://tulrich.com/geekstuff/),那就太好了。

PS 值得一提的是,我使用的是存储在一维数组中的线性八叉树

谢谢你的帮助

0 投票
2 回答
975 浏览

c# - C# XNA - 关闭/关闭屏幕时渲染(?) 3D 对象。(剔除?)

非常大的对象,比如游戏地图,如果它们的原点不在屏幕上,XNA 将完全不会出现。

我在这方面找不到血腥的东西。我已经研究过剔除并试图以几种形式将其添加到项目中以抵消这一点,但无济于事。

我想绘制在屏幕外有起源的对象,这样如果它们部分在屏幕上,它们仍然会显示出来。我将如何实现这一目标?

从我阅读的文档中 cull 应该这样做,不是吗?我可怜的大脑问题(._.)

附带说明一下,如果有人有在 XNA 的 Ox 引擎中创建原语的经验,我会很高兴收到您的来信。

编辑:地狱火......我很确定这个问题只是 Ox 的问题。该死的牛我所有的恨

0 投票
2 回答
1440 浏览

opengl - OPENGL ARB_occlusion_query 遮挡剔除

我很好奇 GPU GEMS 1 中建议的用于执行一定数量查询的遮挡剔除的方法。使用所描述的方法,您不能相互测试各个盒子,所以您应该执行以下操作吗?

测试框 A -> 渲染框 A

测试框 B -> 渲染框 B

测试框 C -> 渲染框 C

等等...

0 投票
2 回答
1216 浏览

opengl - 旧游戏渲染的最佳 OpenGL 剔除方法?

我正在从旧游戏中渲染一些旧几何图形。他们的客户有一些算法可以让他们查看附近的区域,但我没有这种能力,所以我正在研究剔除不必要的多边形。目前,我正在渲染整个区域中的每个多边形,无论我是否可以看到它,无论它是否在可视范围内。显然,这是完全低效的。

我应该考虑使用哪种类型的剔除?

我知道我可以剔除不在截锥体中的多边形,这将有助于减轻一些负载,但我可以说,选择不渲染距相机一定距离的多边形吗?这个叫什么?我也在某些区域使用雾。同样的问题。我能想出一种方法来剔除雾后面的所有东西,我看不到的区域。

0 投票
2 回答
3992 浏览

graphics - 禁用对对象的剔除

这个问题实际上是针对 Unity3D 的,但它也可以是一个更笼统的问题,因此我将尽可能笼统地提出这个问题。

假设我有一个带有 a 的场景,camera (near = 0.3, far = 1000, fov = 60)我想绘制一个半径为 10000 单位的天穹。

物体没有被相机的平截头体剔除,因为我在圆顶内。但是顶点被一些着色器以某种方式剔除,最终结果如下所示:

我剪裁的天穹

现在我的问题是:

我可以更改任何引擎的哪些设置以确保绘制完整的对象并且不会被相机的远平面剪裁?

我不想要的是:

  • 将远平面更改为 10000,因为它会使平截头体不太准确
  • 改近平面,因为我的游戏其实规模很小
  • 改变穹顶的比例,因为这个设置看起来很逼真
0 投票
1 回答
4966 浏览

2d - 2D 遮挡剔除的最佳解决方案

在我的 2D 游戏中,我有静态和动态对象。可以有多个摄像头。我的问题:确定与当前相机的视图矩形相交的对象。

目前,我只是遍历所有现有对象(不关心动态或静态)并使用相机视图对它们进行 AABB 检查。这对于非常动态的对象似乎是可以接受的,但对于静态对象则不然,因为静态对象可能有成千上万个(静态关卡几何体散布在整个场景中)。

我研究了多种可以解决我的问题的数据结构:

  • 四叉树

这是我考虑的第一件事,但问题是它会迫使我的场景具有固定大小。(静态对象可以接受,动态对象不行)

  • 动态 AABB 树

看起来不错,但是对于许多动态对象来说,重新平衡它的开销似乎太大了。

  • 空间哈希

对我来说,这里的主要问题是,如果你用相机缩小很多,必须查询大量几乎不存在的空间哈希桶,导致性能低下。

一般来说,我对这个问题的良好解决方案的标准是:

  • 动态大小:该解决方案不得导致场景大小受到限制,或需要大量重新计算以调整大小

  • 良好的查询性能(针对相机)

  • 对动态对象的良好支持:处理位置不断变化的对象所需的计算应该很好:

在我的游戏中,动态对象的最大合理数量可能是 5000。考虑到它们每帧都会改变它们的位置。考虑到频繁的插入和删除,是否有比每帧将对象的 AABB 与相机进行比较更快的数据结构?

0 投票
1 回答
996 浏览

c++ - 对三角绕组和变换感到困惑

首先,我想为这么长的问题道歉。你不必阅读它。您可以直接跳到问题部分,然后在需要时查找详细信息(我已尝试提供尽可能多的信息,因为根据我的经验,太多的代码总比太少的好)。所以,...

我对三角形绕组和变换有点困惑,我以为我理解了。我正在尝试绘制一个定义如下的立方体:

这些是我脸上的假定颜色:

正如您从评论中看到的那样,我使用了上、下、左、右等术语。如果我们假设我们正在从某个位置(例如,(0, 0, -3a)在世界坐标中)看立方体,这些词就会得到它们的含义。现在,据我了解,我的立方体的正面是逆时针缠绕的(也就是说,如果我们从立方体外部的任何位置查看立方体,并枚举我们看到的三角形中的顶点,我们将得到逆时针缠绕) .

所以,我需要 1. 启用剔除。2. 说逆时针是正面 3. 剔除背面。这是代码:

我的投影矩阵是透视投影矩阵,modelView矩阵只是一个LookAt矩阵。它们作为制服提供给顶点着色器。

我的顶点着色器定义如下:

我的片段着色器很简单——它只输出插值的颜色。

现在......这是我得到的输出:

在此处输入图像描述

如果我更改glFrontFace(GL_CCW);glFrontFace(GL_CW);,或者更改glCullFace(GL_BACK)glCullFace(GL_FRONT),我会得到预期的(至少比前一个更预期,请参阅第二个和第三个问题)渲染:

在此处输入图像描述

我在这里看到三个问题,每个问题都在一个问题中描述:

实际问题:

Q1:为什么绕组与我的意图相反?我没有为正面逆时针缠绕顶点吗?
Q2为什么我的“左”脸和“右”脸互换了位置?左脸应该是黄色的,右脸应该是绿色的,反之亦然!我的转型有什么问题?
Q3我的变换有问题,因为我的眼睛向量的 x 坐标正的,这意味着我实际上应该看到一点右侧,而不是一点左侧!

我一起提出了这些问题,因为我认为它们都是相互关联的,并且可能与我缺少的一些非常基本的东西有关。非常感谢您花时间澄清这些事情。

0 投票
1 回答
354 浏览

flash - 使用 Molehill 进行背面剔除

使用带有新 Molehill API 的 Flash 11 RC1,我想启用背面剔除。测试版文档非常模糊,但该示例暗示 Molehill 希望正面三角形逆时针缠绕,这很正常。

但是,当我的多边形逆时针缠绕时,我得到了完全相反的行为——换句话说,就好像与其自己的例子相反,Molehill 期望正面的三角形顺时针缠绕。由于文档从未明确说明哪个绕组是正确的,我很难过。

我不想只是翻转我所有的三角形,直到它看起来正好在我 100% 了解 Molehill 真正想要的东西之前,因为这很有可能隐藏一个基本的误解。

我正在使用简单的透视投影(下面关于 .transpose() 的注释:因为 copyRawDataFrom 期望数据以列为主,并且我讨厌在代码中查看的方式,我决定只输入它以行为主,然后转置矩阵- 所以起诉我:P):

有什么线索吗?