问题标签 [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 回答
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 投票
2 回答
458 浏览

opengl - 使用 GL_CW 支持带有背面剔除的 GL_CCW 之间是否存在显着的性能差异?

假设我使用以下方法启用背面剔除:

我可以使用以下任何一种配置剔除哪些侧面:

如果我选择其中一个,性能是否会有显着差异?

我的直觉说这没关系,因为这应该只涉及在取标量产品时检查不同的符号。虽然也许这也取决于硬件?

0 投票
1 回答
551 浏览

rendering - OpenSceneGraph - 隐形斗篷

我是使用 OSG 的新手,在尝试解决问题时遇到了一些问题。

我创建了一个场景(一个四边形和两个球体,具有固定的背景),我试图用一个透明的四边形遮挡其中一个球体。我的意思是,制作一个“隐形斗篷”,这样我就可以通过它看到背景图像,但看不到它背后的球体(或投影线中的任何东西)。

我完全陷入困境,因为我一直在做的所有测试都没有让我接近我想要的。如果您能帮我解决这个问题,我将不胜感激,任何想法(或代码!)都非常受欢迎!=)

我附上了我用来进行测试的简单场景的代码。

提前致谢,

干杯,阿尔瓦罗

0 投票
0 回答
226 浏览

java - JavaFx 3D - Display large amount of TriangleMeshes

I am trying to figure out the best way to display a scene that is made of of roughly 150k TriangleMesh. This is on the low end of what I need to be capable of displaying. Currently the FPS is unacceptably low. Are there any built in culling methods (other than setCullFace()) that I could potentially use?

0 投票
1 回答
273 浏览

java - 在 JavaFX 和 Point3D 中确定顶点缠绕(用于背面剔除)

我正在将 j3d GeometryArrays 显示为 JavaFX 中的组合三角网格。我知道我收到的 GeometryArrays 是 TriangleStripArrays,顺序允许我构建正确的面并在场景中显示网格。

但是,我不知道如何仅基于 TriangleStripArray 确定顶点缠绕顺序。这些面目前没有正确的背面剔除概念,给我留下了一个完整的三角形网格,从任何给定的角度来看都是扭曲的。通过将 CullFaceMode 从 BACK 更改为 NONE,并通过绘制场景中的顶点,我可以看出所有面都被正确映射,只是剔除不一致。

我有两种方法可以从任何给定的包含 3 个顶点的三角形面构建一个 TriangleMesh,一种用于 CW 绕组,一种用于 CCW。

本质上:

对比

我的问题是,如何仅根据 TriangleStripArray 确定顶点缠绕顺序,以及每个面应使用哪种方法?(提供了 TexCoordinates,但未使用)

提前致谢!- R.梅尔维尔

0 投票
2 回答
1391 浏览

qt - 剔除可见区域之外的项目

文档

默认渲染器不执行任何 CPU 端视口裁剪或遮挡检测。如果某些东西不应该是可见的,那么就不应该显示它。用于Item::visible: false不应绘制的项目。不添加这种逻辑的主要原因是它增加了额外的成本,这也会损害那些注意表现良好的应用程序。

那么有没有一个技巧可以轻松地做到这一点,而无需自己实现呢?

请注意,在我的情况下,可见区域之外的项目在那里,因为它们在 a 中ScrollView并且它们没有滚动到。

我想要剔除的原因是减少全场景重绘的 CPU 使用率。

0 投票
1 回答
58 浏览

qt - 当项目的祖先的不透明度为 0 时,我可以渲染项目吗?

问题陈述

当项目的祖先的不透明度为 0 时,我可以渲染项目吗?


动机

这个问题的动机是我的另一个问题(我称之为“隐藏纹理源”问题)。请注意,目前我使用的是opacity: 0而不是visible: false,但这会导致与链接问题相同的问题。

我隐藏物品的原因是这个

有一次,我只是直接剔除需要用作纹理源的每个项目。所以隐藏纹理源问题的修复很简单:(简化伪代码)

但现在我也在剔除整个Rows 这样的项目。而且由于不透明度是继承的,如果我想更新 cppItem,我必须为整个 parent 做 unhide-hide dance Row。然后,两个纹理源项目可能会发生具有互锁时序的取消隐藏过程,因此为了避免错误,我必须保留一个自定义引用计数器,该计数器知道当前正在更新多少 cppItems。这对我来说太复杂了。因此,回答我的问题将是有益的。

0 投票
1 回答
797 浏览

opengl - 面剔除适用于 GL_FRONT,但不适用于 GL_BACK

我已经启用了面部剔除glEnable(GL_CULL_FACE),并且我正在尝试剔除背面,但是每当我执行glCullFace(GL_BACK)任何操作时都不会渲染任何内容。

如果我这样做glCullFace(GL_FRONT),它会按预期工作(也就是说,渲染我的立方体的内部,而不是外部)。

我试图改变绕组,但它似乎不是因为GL_FRONT工作。

这可能是什么原因?

如果这很重要,它会被渲染到启用了深度渲染缓冲区的帧缓冲区。禁用剔除使一切都按预期呈现。

编辑

使用的绕组是逆时针的,即最近的一侧:

这是它的外观图像GL_FRONT

与 GL_FRONT

(没有立方体的背面,所以可以看到效果)。同样,这就是我期望的样子。

没有剔除的样子:

没有剔除

0 投票
1 回答
485 浏览

python - 有效屏蔽 np.array 以剔除坏像素的位置(Python 2.7)

我想删除我的坐标和视差数组中坏像素的位置。因此我写了一些代码,但感觉有点迂回,对于任务来说有点太长了。代码背后的主要思想是我希望删除包含-17 差异值的所有数组条目。我的 2000x2000 图像的像素坐标数组也应该发生同样的情况。这是我使用掩码和展平数组的代码。(最后我想要 3 个包含 x、y 和按相同顺序排序的视差值的数组,不包含坏像素的条目和坐标)感谢任何改进此代码的提示!

0 投票
1 回答
521 浏览

particle-system - Babylon.js 禁用 SolidParticleSystem 的截锥体剔除?

我正在尝试一些简单的数据,即点云。我的场景只包含一个 40K 粒子 SolidParticleSystem 和一个用于移动相机时的视觉参考的小地平面。每次世界 0,0,0 离开视锥体(通过旋转或移动相机),整个SolidParticleSystem 停止渲染。

我花了很长时间才弄清楚为什么我的粒子会无缘无故地消失,直到通过反复移动相机的尝试和错误,我才弄清楚发生了什么。参考平面继续按预期渲染。

有可能打败这种行为吗?