我有一个非常简单的案例。我想绘制一个物体的轮廓,在这种情况下,我认为它们只是球体,但我不想依赖它。
我找到了以下方法:
我对这个方法的问题是我的模型有很多顶点,这需要我画三次。我得到了一些显着的帧速率下降。
还有其他方法吗?我的下一个猜测是在最终渲染上绘制圆圈作为后期处理效果,因为我只是在看球体。但我更倾向于这样做而不仅仅是领域。
我可以在现有着色器中做些什么来勾勒出来吗?
我也喜欢当对象落后于其他人时出现的轮廓。
我正在使用OpenGL 4.3。
答案 0 :(得分:3)
我知道三种做轮廓渲染的方法:
第一个是您所描述的版本的略微修改版本:首先在模板缓冲区打开的情况下正常渲染对象,然后稍微缩放它并将其渲染为纯色,而未填充模板缓冲区。您可以找到此技术的解释here。
第二个是后处理步骤,您可以使用图像处理过滤器(如the sobel operator)查找边缘,然后使用轮廓检测结果组合渲染。索贝尔运营商的好处是它可以分离;这意味着您可以在两次1D传递中进行检测,这比进行一次2D传递更有效。
最后但并非最不重要的是,您可以使用几何着色器来提取网格的轮廓。我们的想法是使用三角形的相邻顶点来检测这个三角形的一个边(让我们称之为t0
)是轮廓。
要对ei
的每个边t0
执行此操作:
ti
的顶点及其关联的顶点构建新的三角形ei
,ni
的正常ti
和n0
的正常t0
,在视图空间中对它们进行转换(轮廓取决于视点), n0
和ni
之间的点积。如果其值为负,则表示法线方向相反,边ei
为轮廓边。ei
,emit
构建一个四边形,并在片段着色器中按照您想要的方式为它们着色。 这是该算法的基本思想。仅使用这将导致别名边缘,它们之间有孔,但这可以改善。您可以阅读this paper和this blog post了解更多信息。
答案 1 :(得分:1)
以我的经验,如果将白色(未照明)的轮廓对象渲染为与最终帧缓冲区一样大的纹理,然后使用该纹理绘制一个帧缓冲区大小的四边形并使片段着色器模糊或进行其他处理,您将获得良好的结果。并应用所需的颜色。
我有一个例子here