使用 Qt3D 中的 QClipPlane 的示例程序

问题描述 投票:0回答:1

我正在寻找一些如何使用 QClipPlane 的示例代码,它是 Qt3D 框架的一部分:https://doc.qt.io/qt-5/qt3drender-qclipplane.html

我可以使用Qt提供的“basicshapes-cpp”演示程序,编译并成功运行它,然后它会在屏幕上的窗口中为我绘制形状。

然后我想在这个程序中添加一个剪切平面。我认为 QClipPlane 是此任务的候选者,但我无法理解如何将其合并到工作示例中。

我最远的是从 QRenderStateSet https://doc.qt.io/qt-5/qt3drender-qrenderstateset.html获取一些示例代码,并用 QClipPlane 替换 QCullFace 。

不幸的是,这只会在屏幕上呈现一个完全空白的窗口。然后,我尝试将上面示例中的 renderSettings 对象直接添加到圆环实体或 basicshapes-cpp 演示程序中的球体实体。这产生了相同的效果。

我无法理解 QClipPlane 是如何添加到演示程序中的 - 是通过 Qt3DWindow、QEntity(即根实体)、框架图还是完全其他的东西?一个可行的演示程序将是理想的选择。谢谢

qt clipping qt3d
1个回答
0
投票

这可能有些过头了,但我不久前编写了一个名为 qml3DWater 的 QML/Qt3D 应用程序,它使用剪切平面渲染一个小湖来创建反射和折射效果。您可以在此处找到有关为此目的使用剪裁平面的更多信息:

基本上,剪裁平面被定义为此自定义 PhongShadingMaterial 的一部分,以便可以使用两个渲染通道方法来渲染使用此材质的对象:

  • 在第一遍中,剪切平面矢量允许我们渲染网格的底部部分;
  • 在第二遍上,另一个剪切平面向量允许我们渲染网格的顶部;

PhongShadingMaterial

顶点着色器
使用裁剪平面向量来计算网格每个顶点的
gl_ClipDistance[0]
,本质上是在需要丢弃顶点时通知顶点着色器。

定义多渲染通道方法的

frameGraph
可以在main.qml中找到。

WaterMaterial.qml 还提供了一些附加文档,解释如何使用剪切平面来渲染水反射/折射效果:

frameGraph
上启用剪裁平面对于能够设置
gl_ClipDistance[0]
并让 OpenGL 使用它进行顶点剔除至关重要。

这告诉我们顶点距离裁剪平面 0 有多远。OpenGL 只关心有符号的距离 该平面的每个顶点,无论该平面在哪里: https://www.youtube.com/watch?v=0NH9k4zTAqk&list=PLRIWtICgwaX23jiqVByUs0bqhnalNTNZh&index=3

想象一个剪裁平面将水下和水面以上的部分分开:

  • 顶点在平面内(低于水面)时距离为正;
  • 顶点在平面外(水面以上,平面的剔除面)时距离为负;

因为这是针对每个顶点完成的,并且 OpenGL 将这些距离插值到整个几何图形 并且具有负距离的几何图形的任何部分都会被剔除,因此不会被渲染,而 任何距离为 0.0 或大于 0.0 的东西都会被渲染。

© www.soinside.com 2019 - 2024. All rights reserved.