我知道有几种技术可以实现这一目标,但它们似乎都不够.
使用sobel/laplace滤波器找不到所有正确的边缘(并找到不需要的边缘),速度很慢,并且无法控制轮廓宽度.
我现在已经解决的问题是首先使用纯色和比实际物体稍大的物体渲染物体的背面.结果看起来不错,但我真的希望我的轮廓具有恒定的宽度.
我已经尝试用粗线框线渲染物体的背面.给我一个恒定的轮廓宽度,但不推荐使用线宽,如果轮廓突然改变方向(例如在多维数据集上),则会产生渲染瑕疵并留下间隙.我还没有尝试使用第三个渲染过程绘制每个顶点的线框线大小的点,因为此技术存在其他问题.
有任何想法吗?
编辑我甚至使用几何着色器自己查找边缘,如http://prideout.net/blog/?p=54中所述,但它与线框技术的差距相同.
编辑我能够通过禁用GL_DEPTH_TESTwhile绘制轮廓来摆脱使用线框技术的渲染工件.不幸的是,我也失去了重叠对象的轮廓......
我的目标是在Dragons Lair 3游戏中获得与角色相同的效果.有谁知道他们是怎么做到的?
如果您需要真正的边缘检测,我发现使用卷积 LoG(拉普拉斯高斯)5x5 内核可以获得相当好的结果,应用于深度缓冲区并在渲染对象上混合(可能使用不错的 FSAA)。您需要在片段着色器中进行一些调整才能限制混合轮廓,但结果很好。(顺便说一句,这取决于你真正想要什么)
注意:
1)拉普拉斯过滤和日志过滤是不同的东西并产生不同的结果
2)如果您在深度缓冲区而不是渲染图像上应用卷积,您最终会得到完全不同的结果,此外,如果需要轮廓宽度控制,则可以应用扩张过滤器和选择性侵蚀通道,这样你最终会得到一个与用标记制作的手绘草图非常匹配的渲染,并且你可以很好地控制尖端尺寸,但代价是 2 次额外的通过