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,但如果相机足够近,可以看到单个三角形,线框模式会大大降低速度。在一定距离内,当它们融合成一个红色斑点(呈现为红色)时,帧速率是正常的。