OSG 渲染(3) 动态剖切的实现方法

在CAD工程软件里,很多时候需要动态剖切模型来查看模型截面情况。我们知道OpenGL 固定管线支持用户自定义剖面,且最多支持6个剖平面,OpenGL3.0 以后的版本虽然已经逐步废弃固定管线,但我们可以使用shader,并传递截平面方程参数给shader,使用discard 语句实现类似固定管线用户自定义截面的效果。


下面将介绍如何实现上图动态剖切且加盖的效果,也将说明存在哪些技术难点。

一般方法:

    原理:开启模版测试,并将模版缓存清零操作,然后禁用深度测试,禁用剔除,绘制整个场景,同时模版缓存中的值取反操作,最终在模版非零处填充颜色,就这么简单。

  • 存在的问题    

    该方法依赖于原实体闭合性,如果场景中有开放实体(也就是未封闭的实体),这种方法就没有用武之地了,得到的是错误结果。所以在场景渲染初始化模版缓冲区时,先要过滤掉自由曲面和开放实体。    

   这种方法虽然简单有效,但如果我们要求剖面用被剖对象颜色填充,而不是全部由一种颜色填充,这种方法就无能为力,因为它是与视口和观察方向相关的。

改进方法:

  • 观察方向无关的剖切

    先在剖面方向上使用正交投影使用RTT用上述方法生成截面纹理;

    将截面纹理应用到剖切平面上;

    问题?

    生成截面纹理时,深度测试如何配合剖面应用才能得到正确结果?

    你应该可以想得到,如果在shader中丢弃截面背面片元,深度测试设置为GL_GREATER,就可以得到正确结果。