代码之家  ›  专栏  ›  技术社区  ›  Matphy

三维实体始终可见,即使在另一个实体后面

  •  0
  • Matphy  · 技术社区  · 7 年前

    有没有一种简单的方法在任何时候都显示3D实体,即使这个实体隐藏在另一个实体后面?例如,我希望当直线位于网格曲面之后时,它们始终显示为事件。

    我使用qt3d框架。

    2 回复  |  直到 7 年前
        1
  •  2
  •   Florian Blume    7 年前

    假设你说的是 Qt3D 框架我想扩展rabbid76的答案。

    要在qt3d框架中禁用深度测试,请添加 QRenderStateSet 到呈现事物的framegraph分支(作为 QViewPort 例如)并添加 QDepthTest 为了它。然后,将qdepthtest的深度函数设置为always。这样,深度测试始终通过,后面的实体也将被绘制,具体取决于绘制顺序。你可以用 QSortPolicy 将绘图顺序调整为从后向前。

    但是,当相机位置发生变化,并且您始终希望绘制的实体位于前面时,这将不起作用。我建议您添加另一个framegraph分支并使用 QLayerFilter 仅停用此实体的深度测试。

    如果你的实体在停用深度测试(可能是复杂对象)时看起来很奇怪,你可以替换它。 Q深度测试 QClearBuffers 并简单地清除深度缓冲器。

    看看我的答案 here ,其中我展示了一个带有深度测试的自定义框架图示例。

        2
  •  1
  •   Rabbid76    7 年前

    如果禁用深度测试,则几何图形(如直线)始终绘制在先前绘制的几何图形的顶部。深度测试可通过以下方式禁用:

    glDisable(GL_DEPTH_TEST)
    

    glEnable


    作为替代的深度测试函数,可以设置为让片段始终通过深度测试。在qt中,这可以由类完成 QDepthTest ,使用枚举器常量 Qt3DRender::QDepthTest::Always .

    在这种情况下,必须注意几何图形的绘制顺序。 必须找到一种方法,首先使用深度测试函数渲染多边形(不透明几何体) Qt3DRender::QDepthTest::Less 是的。 之后,您必须通过使用depth test函数在顶部渲染线条 qt3drender::qdepthtest::始终 是的。