问题标签 [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.
opengl - GLSL 着色器:遮挡顺序和剔除
我有一个 GLSL 着色器,它在给定一组贝塞尔曲线(点的 3d 坐标)的情况下绘制 3D 曲线。绘图本身是按照我的意愿完成的,除了遮挡不能正常工作,即在某些视点下,应该在最前面的曲线似乎仍然被遮挡,并且相反:曲线的一部分应该是被遮挡仍然可见。
为了说明,这里有几个截图示例:
我是 GLSL 新手,可能不知道这种效果的正确术语,但我认为它是遮挡剔除(更新:它实际上表明深度缓冲区的问题,术语混乱!)。我的问题是:使用 GLSL 着色器时如何处理遮挡?我是否必须在着色器程序中或其他地方处理它们?
关于我的代码,它有点长(加上我使用 OpenGL 包装库),但主要步骤是:
- 在顶点着色器中,我计算
gl_Position = ModelViewProjectionMatrix * Vertex;
颜色信息并将其进一步传递给几何着色器。 - 在几何着色器中,我采用 4 个控制点 (
lines_adjacency
) 和它们对应的颜色,并生成一个遵循贝塞尔曲线的三角形条带(我在贝塞尔曲线段之间使用了一些基本的颜色插值)。 - 片段着色器也很简单:
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 );
) 来修复它。这解决了我的问题。
关于深度缓冲区设置,我不必明确指定它们,因为我使用的库默认情况下会根据需要正确设置它们。
opengl - 使用 GL_CW 支持带有背面剔除的 GL_CCW 之间是否存在显着的性能差异?
假设我使用以下方法启用背面剔除:
我可以使用以下任何一种配置剔除哪些侧面:
如果我选择其中一个,性能是否会有显着差异?
我的直觉说这没关系,因为这应该只涉及在取标量产品时检查不同的符号。虽然也许这也取决于硬件?
rendering - OpenSceneGraph - 隐形斗篷
我是使用 OSG 的新手,在尝试解决问题时遇到了一些问题。
我创建了一个场景(一个四边形和两个球体,具有固定的背景),我试图用一个透明的四边形遮挡其中一个球体。我的意思是,制作一个“隐形斗篷”,这样我就可以通过它看到背景图像,但看不到它背后的球体(或投影线中的任何东西)。
我完全陷入困境,因为我一直在做的所有测试都没有让我接近我想要的。如果您能帮我解决这个问题,我将不胜感激,任何想法(或代码!)都非常受欢迎!=)
我附上了我用来进行测试的简单场景的代码。
提前致谢,
干杯,阿尔瓦罗
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?
java - 在 JavaFX 和 Point3D 中确定顶点缠绕(用于背面剔除)
我正在将 j3d GeometryArrays 显示为 JavaFX 中的组合三角网格。我知道我收到的 GeometryArrays 是 TriangleStripArrays,顺序允许我构建正确的面并在场景中显示网格。
但是,我不知道如何仅基于 TriangleStripArray 确定顶点缠绕顺序。这些面目前没有正确的背面剔除概念,给我留下了一个完整的三角形网格,从任何给定的角度来看都是扭曲的。通过将 CullFaceMode 从 BACK 更改为 NONE,并通过绘制场景中的顶点,我可以看出所有面都被正确映射,只是剔除不一致。
我有两种方法可以从任何给定的包含 3 个顶点的三角形面构建一个 TriangleMesh,一种用于 CW 绕组,一种用于 CCW。
本质上:
对比
我的问题是,如何仅根据 TriangleStripArray 确定顶点缠绕顺序,以及每个面应使用哪种方法?(提供了 TexCoordinates,但未使用)
提前致谢!- R.梅尔维尔
qt - 剔除可见区域之外的项目
从文档:
默认渲染器不执行任何 CPU 端视口裁剪或遮挡检测。如果某些东西不应该是可见的,那么就不应该显示它。用于
Item::visible: false
不应绘制的项目。不添加这种逻辑的主要原因是它增加了额外的成本,这也会损害那些注意表现良好的应用程序。
那么有没有一个技巧可以轻松地做到这一点,而无需自己实现呢?
请注意,在我的情况下,可见区域之外的项目在那里,因为它们在 a 中ScrollView
并且它们没有滚动到。
我想要剔除的原因是减少全场景重绘的 CPU 使用率。
qt - 当项目的祖先的不透明度为 0 时,我可以渲染项目吗?
问题陈述
当项目的祖先的不透明度为 0 时,我可以渲染项目吗?
动机
这个问题的动机是我的另一个问题(我称之为“隐藏纹理源”问题)。请注意,目前我使用的是opacity: 0
而不是visible: false
,但这会导致与链接问题相同的问题。
我隐藏物品的原因是这个。
有一次,我只是直接剔除需要用作纹理源的每个项目。所以隐藏纹理源问题的修复很简单:(简化伪代码)
但现在我也在剔除整个Row
s 这样的项目。而且由于不透明度是继承的,如果我想更新 cppItem,我必须为整个 parent 做 unhide-hide dance Row
。然后,两个纹理源项目可能会发生具有互锁时序的取消隐藏过程,因此为了避免错误,我必须保留一个自定义引用计数器,该计数器知道当前正在更新多少 cppItems。这对我来说太复杂了。因此,回答我的问题将是有益的。
opengl - 面剔除适用于 GL_FRONT,但不适用于 GL_BACK
我已经启用了面部剔除glEnable(GL_CULL_FACE)
,并且我正在尝试剔除背面,但是每当我执行glCullFace(GL_BACK)
任何操作时都不会渲染任何内容。
如果我这样做glCullFace(GL_FRONT)
,它会按预期工作(也就是说,渲染我的立方体的内部,而不是外部)。
我试图改变绕组,但它似乎不是因为GL_FRONT
工作。
这可能是什么原因?
如果这很重要,它会被渲染到启用了深度渲染缓冲区的帧缓冲区。禁用剔除使一切都按预期呈现。
编辑
使用的绕组是逆时针的,即最近的一侧:
这是它的外观图像GL_FRONT
:
(没有立方体的背面,所以可以看到效果)。同样,这就是我期望的样子。
没有剔除的样子:
python - 有效屏蔽 np.array 以剔除坏像素的位置(Python 2.7)
我想删除我的坐标和视差数组中坏像素的位置。因此我写了一些代码,但感觉有点迂回,对于任务来说有点太长了。代码背后的主要思想是我希望删除包含-17 差异值的所有数组条目。我的 2000x2000 图像的像素坐标数组也应该发生同样的情况。这是我使用掩码和展平数组的代码。(最后我想要 3 个包含 x、y 和按相同顺序排序的视差值的数组,不包含坏像素的条目和坐标)感谢任何改进此代码的提示!
particle-system - Babylon.js 禁用 SolidParticleSystem 的截锥体剔除?
我正在尝试一些简单的数据,即点云。我的场景只包含一个 40K 粒子 SolidParticleSystem 和一个用于移动相机时的视觉参考的小地平面。每次世界 0,0,0 离开视锥体(通过旋转或移动相机),整个SolidParticleSystem 停止渲染。
我花了很长时间才弄清楚为什么我的粒子会无缘无故地消失,直到通过反复移动相机的尝试和错误,我才弄清楚发生了什么。参考平面继续按预期渲染。
有可能打败这种行为吗?