还有哪些方法可以绘制物体的轮廓?

Neo*_*ana 6 opengl

我有一个非常简单的案例。我想绘制一个物体的轮廓,在这种情况下我认为它们只是球体,但我不想依赖于此。

我发现了一些方法,例如:

  1. 将对象绘制到模板缓冲区
  2. 打开线框模式
  3. 用粗线绘制物体
  4. 在上面画出真实的物体

我使用这种方法的问题是我的模型有很多顶点,这需要我绘制三次。我的帧速率明显下降。

还有其他方法可以做到这一点吗?我的下一个猜测是在最终渲染上绘制圆圈作为后期处理效果,因为我只查看球体。但我宁愿这样做不仅仅是为了领域。

我可以在现有的着色器中做一些勾画轮廓的事情吗?

我还希望当对象位于其他对象后面时出现轮廓。

我正在使用 OpenGL 4.3。

Zou*_*uch 9

我知道 3 种进行轮廓渲染的方法:

使用模板缓冲区

第一个是您所描述的版本的稍微修改的版本:首先在打开模板缓冲区的情况下正常渲染对象,然后稍微缩放它并在模板缓冲区未填充的地方渲染它的纯色。您可以在此处找到此技术的说明。

使用图像处理技术

第二个是后处理步骤,您使用图像处理过滤器(如sobel 算子)查找边缘,并使用轮廓检测​​结果组成渲染。sobel 运算符的好处是它是可分离的;这意味着您可以在两次一维通道中进行检测,这比进行一次二维通道更有效。

使用几何着色器

最后但并非最不重要的一点是,您可以使用几何着色器来提取网格的轮廓。这个想法是使用三角形的相邻顶点来检测该三角形的一条边(我们称之为轮廓t0)是否是轮廓

为此,对于 的每条eit0

  • ti使用 的顶点ei及其关联的顶点构建一个新三角形,
  • 计算 的法线和 的法线,在视图空间中变换它们ni(轮廓取决于视点),tin0t0
  • n0计算和之间的点积ni。如果其值为负,则表示法线方向相反,并且该边ei是轮廓边。
  • 然后,您围绕及其每个顶点构建一个四边形ei,并在片段着色器中按照您想要的方式为它们着色。emit

这就是这个算法的基本思想。仅使用此选项会导致边缘锯齿,边缘之间有孔,但这可以改进。您可以阅读本文这篇博客文章以获取更多信息。