问题标签 [occlusion-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 回答
582 浏览

javascript - 使用 JavaScript 或 jQuery 伪造滚动条

我目前正在制作一个使用 knockoutJS 和 jQuery 制作的自定义表格。因为该表可能处理 1,000 - 100,000 行,所以我在 KnockoutJS 中实现了自己的虚拟滚动技术,以确保一次只能看到 35 个左右的元素(取决于视口高度)。当使用滚轮滚动时,表格的 tr 元素会在原地动态更新以产生滚动的错觉。这很管用。

但是,我需要想办法实现假滚动条。我需要一个假滚动条,它实际上并不滚动页面,而是在拖动时调用一个函数,以便我可以将该信息重新定向到我的 knockoutJS 虚拟滚动条以更新 tr 元素。

我对jScrollPane进行了一些研究,但不确定它是否支持我想要的。其他人有这方面的经验吗?

谢谢。

0 投票
1 回答
1298 浏览

opengl - GLSL 着色器:遮挡顺序和剔除

我有一个 GLSL 着色器,它在给定一组贝塞尔曲线(点的 3d 坐标)的情况下绘制 3D 曲线。绘图本身是按照我的意愿完成的,除了遮挡不能正常工作,即在某些视点下,应该在最前面的曲线似乎仍然被遮挡,并且相反:曲线的一部分应该是被遮挡仍然可见。

为了说明,这里有几个截图示例:

1 - 彩色曲线更靠近相机,因此在此处正确渲染。 正确渲染

2 - 彩色曲线应该在灰色曲线之后,但它呈现在顶部。 错误的渲染

我是 GLSL 新手,可能不知道这种效果的正确术语,但我认为它是遮挡剔除(更新:它实际上表明深度缓冲区的问题,术语混乱!)。我的问题是:使用 GLSL 着色器时如何处理遮挡?我是否必须在着色器程序中或其他地方处理它们?

关于我的代码,它有点长(加上我使用 OpenGL 包装库),但主要步骤是:

  1. 在顶点着色器中,我计算gl_Position = ModelViewProjectionMatrix * Vertex;颜色信息并将其进一步传递给几何着色器。
  2. 在几何着色器中,我采用 4 个控制点 ( lines_adjacency) 和它们对应的颜色,并生成一个遵循贝塞尔曲线的三角形条带(我在贝塞尔曲线段之间使用了一些基本的颜色插值)。
  3. 片段着色器也很简单:gl_FragColor = VertexIn.mColor;.

关于 OpenGL 设置,我启用了GL_DEPTH_TEST,但它似乎没有我需要的任何东西。此外,如果我在场景中放置任何其他非着色器几何体(例如四边形),则无论视点如何,曲线始终呈现在其顶部。

任何有关如何解决它以及为什么会发生的见解和提示都值得赞赏。

更新解决方案

因此,据我所知,最初的问题不是寻找剔除算法,而是我没有正确处理 z 值的计算(请参阅接受的答案)。我还了解到,给定正确的深度缓冲区设置,OpenGL 会自行正确处理遮挡,因此我不需要重新发明轮子。

vec2( vertex.xy / vertex.w ) * Viewport;我搜索了我的 GLSL 程序,发现在将顶点坐标转换为屏幕坐标 ( )时,我基本上将几何着色器中的 z 值设置为零。我通过vertex.z/vertex.w分别计算 z 值 ( ) 并将它们分配给发射点 ( gl_Position = vec4( screenCoords[i], zValues[i], 1.0 );) 来修复它。这解决了我的问题。

关于深度缓冲区设置,我不必明确指定它们,因为我使用的库默认情况下会根据需要正确设置它们。

0 投票
0 回答
363 浏览

unity3d - 遮挡剔除过早

我的遮挡设置在某种程度上是错误的,因为它有时遮挡得太早

这里看起来不错,红色箭头标记了问题隧道 在此处输入图像描述

如果我将相机向后移动一两分米,隧道部分被剔除得太早,您会看到绿色明显线是错误的,查看预览,您会看到红色轮廓的结果 在此处输入图像描述

这是我的区域设置 在此处输入图像描述

任何想法为什么这样做?

0 投票
0 回答
382 浏览

unity3d - 正交相机不是遮挡剔除?

在根据需要完成遮挡剔除的场景中,

当我将相机更改为正交相机时,没有完成遮挡剔除。

(看右边红色箭头所指的球体)

在此处输入图像描述我应该怎么办?

0 投票
1 回答
458 浏览

three.js - 如何在三个js中检索边界框的网格?

我实际上正在努力在 three.js 上实现一些遮挡剔除,我想知道是否有办法从 THREE.Box3 中检索此边界框内的所有相应网格?
three.js 中的边界框是否跟踪它包含的网格?
谢谢你们 。

0 投票
0 回答
130 浏览

javascript - 合并边界框的可见性查询...有可能吗?

我有一个非常大的场景要渲染(大约 > 10-20M 多边形),使用 three.js,具有可接受的帧速率。
所以我正在使用 WebGL2 渲染器实现一些基本的遮挡剔除。这就是我的问题:
我想从three.js 中压缩所有的表演。在这个场景中,有数十万个不同的个体网格。
每个网格都必须计算它自己的边界框……这意味着数十万个 B 框……
而且我认为发出数十万个可见性查询不会很快。
那么是否可以合并所有这些边界框,只发送一个可见性查询绘制调用,并以某种方式检索每个边界框及其自己的可见性查询结果?

0 投票
1 回答
1649 浏览

three.js - 三js:我的点是可见的还是被遮挡的?

我有一个空间点在三个 js 查看器中表达一个向量。附在这一点上有一个“HTML注释”

可见注释

当点不可见时我想隐藏(在同一网格的其他表面后面或被其他网格隐藏)。例如在下图中它应该被隐藏:

应该是不可见的

我正在使用一些代码来检查注释是否在另一个问题中建议的截锥体中,但这并不完全有效,因为注释仅在我非常剧烈地旋转对象时才会消失。见下图:

现在不可见

你能帮我解决我的问题吗?

到目前为止,这是我的代码:

0 投票
0 回答
754 浏览

javascript - Threejs中如何实现遮挡剔除?

你好,现在有一个研究方向,web上视觉大型3D建筑的开发,但是数量太大,发现threejs没有很好的方法来实现occlusion culing,请问有什么好的方法实现这个?Frustum Culling已经实现。我是中国学生,翻译来自google,不好意思。</p>

0 投票
1 回答
74 浏览

3d - 在哪个空间进行可见表面测定以及如何进行?

可见性问题可以通过按深度对多边形进行排序(Painter 算法)来解决,并在 z 范围重叠的情况下支持 Newell 算法。Newell 算法在此处此处进行了解释。第 3 点和第 4 点涉及将多边形 1 的每个顶点与多边形 2 的平面进行比较。

为了得到正确的结果,我们应该在裁剪后进行比较(因为裁剪后的多边形可能会从视点完全位于另一个多边形平面的另一侧)。裁剪是在投影之后完成的(因为投影矩阵定义了要裁剪的截头体),这意味着我们必须在投影之后将顶点与平面进行比较。

此外,我们必须将向量归一化,因为投影空间中的 x、y 和 z 值仅适用于它们自己的 w 上下文。

归一化后,我们不再有线性深度,这意味着如果将两个多边形靠近远平面,它们的 z 值会变得更近。在非线性深度空间中,计算法线、点平面距离或检测点位于平面哪一侧所需的任何东西都将失败。

那么,如何执行“P的所有顶点是否都比Q的平面更深”这一步呢?

0 投票
1 回答
451 浏览

vtk - 如何在不删除点或线的情况下选择性地渲染 VTK PolyData

我有一个渲染 PolyData 的管道。PolyData 仅由点和线组成(特别是没有面)。我有点的法线,可以让我做一些基于点的背面剔除,但我看不出如何将某种过滤器应用于管道以隐藏这些节点。我想这样做,以便我可以使用交互器平移、倾斜和滚动视图,而无需重建 PolyData。

看来这应该是可能的。有人可以指导我查看 API 文档的适当部分吗?