我正在寻找一些如何使用 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(即根实体)、框架图还是完全其他的东西?一个可行的演示程序将是理想的选择。谢谢
这可能有些过头了,但我不久前编写了一个名为 qml3DWater 的 QML/Qt3D 应用程序,它使用剪切平面渲染一个小湖来创建反射和折射效果。您可以在此处找到有关为此目的使用剪裁平面的更多信息:
基本上,剪裁平面被定义为此自定义 PhongShadingMaterial 的一部分,以便可以使用两个渲染通道方法来渲染使用此材质的对象:
顶点着色器使用裁剪平面向量来计算网格每个顶点的
gl_ClipDistance[0]
,本质上是在需要丢弃顶点时通知顶点着色器。
定义多渲染通道方法的
frameGraph
可以在main.qml中找到。
WaterMaterial.qml 还提供了一些附加文档,解释如何使用剪切平面来渲染水反射/折射效果:
在
上启用剪裁平面对于能够设置frameGraph
并让 OpenGL 使用它进行顶点剔除至关重要。gl_ClipDistance[0]
这告诉我们顶点距离裁剪平面 0 有多远。OpenGL 只关心有符号的距离 该平面的每个顶点,无论该平面在哪里: https://www.youtube.com/watch?v=0NH9k4zTAqk&list=PLRIWtICgwaX23jiqVByUs0bqhnalNTNZh&index=3
想象一个剪裁平面将水下和水面以上的部分分开:
- 顶点在平面内(低于水面)时距离为正;
- 顶点在平面外(水面以上,平面的剔除面)时距离为负;
因为这是针对每个顶点完成的,并且 OpenGL 将这些距离插值到整个几何图形 并且具有负距离的几何图形的任何部分都会被剔除,因此不会被渲染,而 任何距离为 0.0 或大于 0.0 的东西都会被渲染。