Opengl 我还能用什么方法画出物体的轮廓?

Opengl 我还能用什么方法画出物体的轮廓?,opengl,Opengl,我有一个非常简单的案例。我想画一个物体的轮廓,在这种情况下,我认为它们只会是球体,但我不想依赖这个 我找到了如下方法: 将对象绘制到模具缓冲区 启用线框模式 用粗线绘制对象 在顶部绘制真实对象 这个方法的问题是我的模型有很多顶点,这需要我画三次。我的帧速率明显下降 还有其他方法吗?我的下一个猜测是在最终渲染上画圆圈作为后期处理效果,因为我只看球体。但我更愿意这样做,而不仅仅是为了球体 我可以在现有着色器中做些什么来勾勒轮廓吗 我还希望在对象位于其他对象后面时显示轮廓 我正在使用OpenGL 4.

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

我找到了如下方法:

  • 将对象绘制到模具缓冲区
  • 启用线框模式
  • 用粗线绘制对象
  • 在顶部绘制真实对象
  • 这个方法的问题是我的模型有很多顶点,这需要我画三次。我的帧速率明显下降

    还有其他方法吗?我的下一个猜测是在最终渲染上画圆圈作为后期处理效果,因为我只看球体。但我更愿意这样做,而不仅仅是为了球体

    我可以在现有着色器中做些什么来勾勒轮廓吗

    我还希望在对象位于其他对象后面时显示轮廓


    我正在使用OpenGL 4.3。

    我知道3种绘制轮廓的方法:

    使用模具缓冲区 第一个版本是您描述的版本的稍微修改版本:首先在启用“模具缓冲区”的情况下以正常方式渲染对象,然后稍微缩放对象,并在未填充模具缓冲区的情况下以纯色渲染对象。你可以找到这种技术的解释

    使用图像处理技术 第二个步骤是后期处理步骤,使用图像处理过滤器(如)查找边缘,并使用轮廓检测结果合成渲染。sobel算子的优点在于它是可分离的;这意味着您可以在两个1D过程中执行检测,这比执行一个2D过程更有效

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

    为此,对于
    t0
    的每个边
    ei

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

    这是该算法的基本思想。仅使用此选项将产生锯齿边,边之间有孔,但这是可以改进的。您可以阅读,并获取更多信息。

    根据我的经验,如果将轮廓对象以白色(未发光)渲染为与最终帧缓冲区一样大的纹理,然后使用该纹理绘制帧缓冲区大小的四元体,并使片段着色器模糊或以其他方式处理并应用所需的颜色,您将获得良好的效果


    我有一个例子

    你能说明你是如何用spencil buffer实现它的吗?我不认为这会导致明显的帧速率损失。@eldo没有LOD,但如果相机足够近,可以看到单个三角形,线框模式会大大降低速度。在一定距离内,当它们融合成一个红色斑点(呈现为红色)时,帧速率是正常的。