我有一个非常简单的案例。我想绘制一个物体的轮廓,在这种情况下我认为它们只是球体,但我不想依赖于此。
我发现了一些方法,例如:
我使用这种方法的问题是我的模型有很多顶点,这需要我绘制三次。我的帧速率明显下降。
还有其他方法可以做到这一点吗?我的下一个猜测是在最终渲染上绘制圆圈作为后期处理效果,因为我只查看球体。但我宁愿这样做不仅仅是为了领域。
我可以在现有的着色器中做一些勾画轮廓的事情吗?
我还希望当对象位于其他对象后面时出现轮廓。
我正在使用 OpenGL 4.3。
我知道 3 种进行轮廓渲染的方法:
第一个是您所描述的版本的稍微修改的版本:首先在打开模板缓冲区的情况下正常渲染对象,然后稍微缩放它并在模板缓冲区未填充的地方渲染它的纯色。您可以在此处找到此技术的说明。
第二个是后处理步骤,您使用图像处理过滤器(如sobel 算子)查找边缘,并使用轮廓检测结果组成渲染。sobel 运算符的好处是它是可分离的;这意味着您可以在两次一维通道中进行检测,这比进行一次二维通道更有效。
最后但并非最不重要的一点是,您可以使用几何着色器来提取网格的轮廓。这个想法是使用三角形的相邻顶点来检测该三角形的一条边(我们称之为轮廓t0)是否是轮廓。
为此,对于 的每条ei边t0:
ti使用 的顶点ei及其关联的顶点构建一个新三角形,ni(轮廓取决于视点),tin0t0n0计算和之间的点积ni。如果其值为负,则表示法线方向相反,并且该边ei是轮廓边。ei,并在片段着色器中按照您想要的方式为它们着色。emit这就是这个算法的基本思想。仅使用此选项会导致边缘锯齿,边缘之间有孔,但这可以改进。您可以阅读本文和这篇博客文章以获取更多信息。
| 归档时间: |
|
| 查看次数: |
11853 次 |
| 最近记录: |