> 文章列表 > 描边/轮廓线总结

描边/轮廓线总结

描边/轮廓线总结

文章目录

  • 种类概述
    • 基于V和N描边
    • 过程式几何描边
    • 后处理描边
    • 轮廓边检测描边

refer:


Unity模板描边

openGL模板测试

《UnityShader入门精要》

种类概述

描边的基础实现方式有以下这五大类:

  1. 基于V和N描边:通过V·N来得到轮廓信息,只需要一个Pass
    (缺点:效果一般)
  2. 过程式几何描边:先渲染放大的背面,再渲染正面,这样轮廓就出现在屏幕上了;需要两个Pass,适合表面平滑模型
    (缺点:不适合cube这种规则平整的模型)
  3. 后处理描边:通过后处理的卷积实现,详情看本人的另一篇文章
    (缺点:深度和法线变化小的轮廓无法检测:桌面上的纸张)
  4. 轮廓边检测描边:通过公式(后面会讲)判断模型上的哪些边是位于边缘的,直接获取构成轮廓的边,并直接用渲染这些边
    (缺点:由于是逐帧单独提取轮廓,因此帧之间会出现跳跃性)

*以上4种结合使用:

  • 34结合:先找到轮廓边,再将模型和轮廓边都渲染到RenderTex中,再在RenderTex中进行风格化处理

基于V和N描边

就是边缘光啦,详细去看本人的边缘光文章,很简单,这里不作介绍

过程式几何描边

代码实现在这篇文章中,后续在处理下面残留的几个问题后,我会把代码改进并搬过来(坏!那篇文章还没写完,后续补吧)

Learn OpenGL中的模板测试描边,个人认为可以包含在这部分中,原理是一致的,只是实现细节不一样:

模板测试描边:很简单,用模板测试渲染两次模型,第一次渲染时放大模型并用纯色Pass,第二次正常渲染(第五个入门精要里没有说)

(暂时还没法解决这些问题,后续学懂了再来修改)
存在的问题:

  • 为什么非要放大背面?直接放大前面不行吗,反正都是覆盖
  • 真的会穿帮吗?如果是按照OpengGL的模板测试描边那样,是不可能穿帮的,这里的唯一可能性就是:Unity的Early-Z技术,在对象有交叉的时候会变化渲染顺序,opengl是自己决定这个顺序,因此不存在这个担忧

后处理描边

就是边缘检测啦,去看我的这篇文章

简单说一下,就是数字信号处理,特定卷积核过一遍RenderTex
直接用肯定不行,要结合别的方法

轮廓边检测描边

具体公式及理解

           ( N 0 ⋅ V > 0 ) ≠ ( N 1 ⋅ V > 0 ) (N_0·V>0)\\neq(N_1·V>0) (N0V>0)=(N1V>0)

公式应用的对象:模型上两个相邻的三角形和其临边
N 0 N_0 N0 N 1 N_1 N1分别代表两个面的法线,V为摄像机到该边上任一顶点的向量;本质上是判断两个三角形是否正反面相同,很好理解,如果不同,那这个边就会使轮廓边(说不出来,仔细想想就明白了)

还没学代码,之后来补