OpenGL中的轮廓/剪影渲染

5

我知道有几种技术可以实现这个效果,但似乎都不够完美。

  • 使用Sobel/Laplace滤波器不能找到所有正确的边缘(并会找到不需要的边缘),速度较慢且无法控制轮廓线的宽度。

  • 目前我采用的方法是先用实心颜色渲染对象的背面,并比实际对象略大。结果看起来不错,但我真的希望我的轮廓线有恒定的宽度。

  • 我已经尝试使用粗线框渲染对象的背面。这样可以得到恒定的轮廓线宽度,但由于线宽被弃用,会产生渲染问题并留下间隙,如果轮廓线突然改变方向(如在立方体上)。因为该技术存在其他问题,我还没有尝试使用第三次渲染通过为每个顶点绘制线框大小的点。

有任何想法吗?

编辑 我甚至尝试了使用几何着色器自行查找边缘,如http://prideout.net/blog/?p=54中所述,但它也会出现线框技术中的间隙问题。

编辑 通过在绘制轮廓线时禁用GL_DEPTH_TEST,我已经成功消除了线框技术中的渲染伪影。不幸的是,重叠对象上的轮廓线也被消除了...

我的目标是获得类似于《龙之巢穴3》游戏中人物使用的效果。有人知道他们是如何做到的吗?


你到底想要什么?我没有看过DS3,所以我不知道...你是想要真正的边缘检测(包括渲染对象内部的边缘),还是只是想要一个物体的外轮廓?我猜你在谈论一个三维物体...但也许我错了,你正在处理二维图像,只是想进行二维后期处理。 - user815129
我正在尝试使用cel / toon着色常用的轮廓勾勒来实现卡通风格。所以我不想要完整的线框模型(这很容易实现),但我也不仅仅想要外部轮廓。请尝试谷歌搜索“cel着色”或“toon着色”。您还可以使用Google图片搜索轻松获取一些《龙之巢穴3》的图片;) - cargath
是的,我也这么认为。看看我的回答,你会得到比编写简单的通用卡通着色器更好的结果(当法线几乎垂直于观察者时,你不会得到所有这些伪影)。 - user815129
2
我假设你所说的“龙穴3”是指实时渲染的“龙穴3D”,而不是手工动画全程录制的“龙穴III”(就像最初的“龙穴”和“龙穴II”一样)。在我看来,“龙穴3D”实际上是沿着角色轮廓线和某些预定三角形边缘(背包的荷叶等)绘制单像素宽的线框。看起来他们没有做任何特别花哨的事情,但对于他们的平面阴影卡通外观效果非常好。 - Trevor Powell
是的,我认为你关于名称是正确的 :) 听起来够花哨 - 使用背面剔除方法,我尝试了单像素宽的线条,但在深度缓冲中不可见。如果没有深度缓冲,您可以看到对象背面的线框架。因此,他们必须想办法计算要绘制哪些线条。他们在2002年有几何着色器吗? - cargath
1个回答

3
如果你想进行真正的边缘检测,我发现使用卷积LoG(高斯拉普拉斯)5x5内核应用于深度缓冲区并混合渲染对象(可能加上体积抗锯齿)可以得到相当好的结果。在片段着色器中需要进行一些调整,以夹紧混合轮廓线,但结果很好。(顺便说一句,这取决于你真正想要什么)
注意:
1)拉普拉斯滤波和对数滤波是不同的,并且产生不同的结果。
2)如果你将卷积应用于深度缓冲区而不是渲染图像,你将得到完全不同的结果。此外,如果需要控制轮廓线宽度,则可以应用膨胀滤波器,然后进行选择性侵蚀处理,这样就可以得到与用记号笔手绘的草图非常接近的渲染效果,并且你可以对笔尖大小进行精细控制,但代价是多两个步骤。

兄弟,你为什么要写这样愤怒的留言给版主呢?他们都是志愿者,请友善对待他们。 - rikkit
-1:对于大写锁定键的注意事项请向管理员报告。与其只是三次重新发布相同的答案,为什么不更改您的帖子,以便详细解释该技术是什么以及它与OP说他已经尝试过的有何不同呢? - Nicol Bolas
此外,我不明白你的方法如何给他提供他似乎想要的对轮廓宽度的明确控制。 - Nicol Bolas
1
我不必因为版主不理解就改变一个完全有效的答案。用户实际上并不是在抱怨轮廓宽度,而是关于边缘检测的正确性,这样做可以比在渲染上应用Sobel/Laplacian算子得到更准确的边缘。需要注意的是,如果希望对检测到的轮廓进行明确的控制,可以应用膨胀滤波器,然后再进行选择性侵蚀滤波器(我几周前就这么做了)。这样你就可以得到一个与手绘草图(使用标记笔)非常接近的渲染效果,并且可以对笔尖大小进行精细控制。 - user815129
1
你说得对,我错了,讽刺不是来自管理员而是来自你,我不明白像“失败者”、“弱者”或其他类似的人身攻击有助于别人理解什么。至于我,我已经更正了大小写和注释。如果你不想伤害他人的感情,请避免使用那种评论。 - user815129
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接