使用OpenGL进行轮廓/轮廓渲染

时间:2012-01-12 12:59:00

标签: opengl

我知道有几种技术可以实现这一目标,但这些技术似乎都不够。

  • 使用sobel / laplace过滤器找不到所有正确的边缘(并找到不需要的边缘),速度很慢,并且无法控制轮廓宽度。

  • 我现在所解决的是首先使用纯色和比实际物体稍大的物体渲染物体的背面。结果看起来不错,但我真的希望我的轮廓具有恒定的宽度。

  • 我已经尝试用粗线框线渲染物体的背面。给我一个恒定的轮廓宽度,但不推荐使用线宽,如果轮廓突然改变方向(例如在多维数据集上),则会产生渲染瑕疵并留下间隙。我还没有尝试使用第三个渲染过程绘制每个顶点的线框线大小的点,因为这个技术存在其他问题。

有什么想法吗?

编辑我甚至考虑过使用几何着色器找到边缘,如http://prideout.net/blog/?p=54中所述,但它与线框技术的间隙相同。

编辑通过在绘制轮廓时禁用GL_DEPTH_TEST,我能够使用线框技术消除渲染工件。不幸的是,我也失去了重叠对象的轮廓......

我的目标是在Dragons Lair 3游戏中获得与角色相同的效果。有谁知道他们是怎么做到的?

1 个答案:

答案 0 :(得分:3)

如果您正在进行真正的边缘检测,我发现使用卷积LoG(拉普拉斯高于高斯)5x5内核可以获得相当不错的结果,应用于深度缓冲区并在渲染对象上进行混合(可能有一个像样的FSAA)。您需要在片段着色器中进行一些调整以便夹住混合轮廓,但结果很好。 (这是你真正想要的,顺便说一下)

请注意:

1)拉普拉斯滤波和日志过滤是不同的事情并产生不同的结果

2)如果你在深度缓冲区上应用卷积而不是渲染图像,你会得到完全不同的结果,此外,如果需要轮廓宽度控制,则遵循扩张滤镜通过选择性侵蚀传递可以应用,这样你最终会得到一个与用标记制作的手绘草图紧密匹配的渲染,你可以很好地控制尖端尺寸但是需要额外传递2次