基于OpenGL的轮廓/轮廓绘制

基于OpenGL的轮廓/轮廓绘制,opengl,Opengl,我知道有几种技术可以实现这一点,但它们似乎都不够 使用sobel/laplace过滤器无法找到所有正确的边(并找到不需要的边),速度较慢,无法控制轮廓宽度 我现在决定先用纯色渲染对象的背面,并且比实际对象大一点。结果看起来不错,但我真的希望我的轮廓有一个恒定的宽度 我已经尝试过用粗线框线渲染对象的背面。给我一个恒定的轮廓宽度,但不推荐使用线宽,如果轮廓突然改变方向(例如在立方体上),会产生渲染瑕疵并留下间隙。我还没有尝试使用第三个渲染过程为每个顶点绘制一个线框线大小的点,因为这种技术存在其他问

我知道有几种技术可以实现这一点,但它们似乎都不够

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

  • 我现在决定先用纯色渲染对象的背面,并且比实际对象大一点。结果看起来不错,但我真的希望我的轮廓有一个恒定的宽度

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

有什么想法吗

编辑我甚至考虑过自己使用几何体着色器查找边,如中所述,但它与线框技术存在相同的间隙

编辑我能够通过在绘制轮廓时禁用
GL\u DEPTH\u测试
来使用线框技术消除渲染瑕疵。不幸的是,我还丢失了重叠对象的轮廓


我的目标是获得他们在龙穴3游戏中对角色使用的相同效果。有人知道他们是怎么做到的吗?

如果你在进行真正的边缘检测,我发现使用卷积日志(拉普拉斯高斯)5x5内核,应用于深度缓冲区,并在渲染对象上混合(可能使用合适的FSAA),可以得到非常好的结果。您需要在片段着色器中进行一些调整,以钳制混合轮廓,但效果良好。(顺便说一句,这是你真正想要什么的问题)

请注意:

1) 拉普拉斯滤波和对数滤波是不同的东西,产生不同的结果


2) 如果在深度缓冲区上应用卷积,而不是渲染图像,则会得到完全不同的结果。此外,如果需要轮廓宽度控制,则可以应用扩展过滤器,然后是选择性腐蚀过程,这样,最终的渲染结果将与使用标记绘制的手绘草图非常匹配,并且可以很好地控制尖端大小,但代价是额外进行两次渲染

您到底想要什么?我没有见过DS3,所以我不知道。。您是想要进行真正的边缘检测(边缘也在渲染对象内部),还是只寻找对象的外部轮廓?我想你说的是一个3d物体。。但也许我错了,你正在处理2D图像,你只想做2D后处理。我试图获得cel/toon着色常用的轮廓,以实现卡通效果。所以我不想要一个完整的线框模型(这很容易),但我也不想要外部轮廓。尝试谷歌“cel着色”或“卡通着色”。您还可以使用谷歌图片搜索轻松获得一些龙巢穴3的图片;)是的,我想是的,看到我的答案了吗?你得到的结果比编写一个简单的普通卡通着色器要好得多(当法线几乎垂直于查看器时,你不会得到所有的瑕疵)。我假设“龙穴3”,你指的是实时渲染的“龙穴3D”,而不是“龙穴III”(这是全手工制作的FMV,就像原始的《龙穴》和《龙穴II》)。在我看来,《龙穴3D》实际上是在画单像素宽的线框线。沿着人物轮廓和某些预先指定的三角形边缘(背包的翻盖等看起来并不是他们在做什么特别的花哨的事情,但对于他们的平面阴影卡通造型来说效果非常好。是的,我认为你的名字是对的:)听起来很花哨-使用背面消隐方法,我尝试了单像素宽的线在深度缓冲下是看不见的。没有深度缓冲,你可以看到物体背面的线框。所以他们必须计算出要画的线。2002年他们有几何体着色器吗?哥们,愤怒的音符是怎么回事主持人。他们都是志愿者,对他们好一点。-1:对于主持人的大写锁定说明。与其把同一个答案转载三次,为什么你不改变你的帖子,让它详细解释这项技术是什么,以及它与OP所说的他已经尝试过的有什么不同?另外,我不知道你的方法如何给他明确的c控制他似乎想要的轮廓宽度。我不必仅仅因为版主不在下而更改一个完全有效的答案。用户并不是真的在抱怨轮廓宽度,而是抱怨边缘检测的正确性,这样你会得到比在渲染上应用sobel/lplacian更正确的边缘。请注意,如果需要对检测到的轮廓进行显式控制,可以应用扩张过滤器,然后是选择性腐蚀过滤器(我几周前做过)。你最终得到的渲染与用记号笔绘制的手绘草图非常匹配,而且你可以很好地控制提示大小。你是对的,我错了,讽刺不是来自主持人,而是来自你,我不明白添加个人冒犯,如失败、松散或其他什么,如何帮助其他人理解。就我而言,我纠正了大写字母,并如果你不想伤害别人的感情,就不要使用这种评论