曲面细分和细分区别

        有两个经常被混淆的概念,曲面细分(Subdivision surfaces)和细分(Tessellation or Subdivision)。我们知道细分是一种增加面的方法,但是它只是增加多边形对象的点数,新增的顶点仍然在原来的平面上。曲面细分使用比如 catmull-clark 算法将将曲面做适当的变形,这个过程会改变所有旧的顶点和新顶点的位置,从而产生平滑的过渡结果。

Tessellation

        图形学中,Tessellation是一个渲染阶段,叫做细分着色器。但是网络上大量资料使用的名词是曲面细分着色器,这样翻译实际上是不准确的。因为这个阶段实际上只有细分,希望大家遇到这些名词时能够辨析一下它们的区别。参考下图来自Tessellation Stages

         以在Unity中编写Tessellation Shader为例,我们需要分别实现Hull Shader和Domain Shader,其中最重要的部分是定义ConstantFunction中的Tess Factor(ConstantFunction中的Constant是指在单个Patch中保持不变,Patch是指图元,比如三角形是3个顶点)。这个结果是类似这样的:

struct TessellationFactors {
    float edge[3] : SV_TessFactor;
    float inside : SV_InsideTessFactor;
};

        SV_TessFactor语义指代边的细分数,SV_InsideTessFactor指代面内的细分数,细分的效果主要由SV_InsideTessFactor决定,SV_TessFactor只影响边缘。这里给出了两者设置为相同值的结果,更详细的可以前往Tessellation查看。

         从上面的结果就可以看出,Tessellation新增的顶点实际上就是由Tess Factor唯一确定的,按照均分关系和重心位置对原来的三角面做了递归细分。每一个Patch新生成的顶点永远在相同的面上,新旧顶点都不存在位移。

        Tessellation Stage主要的应用是结合Displacement Texture(位移贴图)实现更好的效果。能够根据观察距离动态调整Tess Factor,这样在近的地方细分面很多方便查看细节,在远处又可以减少细分面优化性能,这里对效果做了对比:

 固定Factor(左)动态Factor(右)

        Tessellation Stage实际上只是将新的顶点插入到相同的平面。我们在Domain Shader的最后,根据采样的Displacement Texture手动设置的这些顶点的位置偏移。所以Tessellation只是为我们做位置偏移提供了足够的顶点,没有下文将要提到的曲面细分平滑处理。

Subdivision surfaces

        在3D建模中,曲面细分是非常常用的工具。以maya为例,可以通过快捷键3使一个物体开启曲面细分,对比如下:

 

         可以看到前后棱角分明的图形变成了圆,硬边变成了软边,法线也被平滑。在属性编辑器里可以查看平滑网格设置:

         这里可以看到细分方法,默认的是Catmull-Clark细分算法,这个算法的介绍推荐看闫老师的Game101,简述一下算法就是:首先在面和边的中点位置插入新的顶点,然后按照权重更新新的顶点位置,再按照权重更新旧的顶点位置。因为涉及到按权重平均,随着细分次数增加曲面会越来越平滑,最终所有的棱角硬边都会消失,形成一个完全光滑的曲面。

        曲面细分主要作用是完成低模渲染高模的转换,为了提高性能游戏引擎中一般使用低模模型,这时就需要将高模中的高精度信息烘焙到贴图中,比如Maya的传递贴图功能提供了法线、置换(就是Displacement)、Ambient Occlusion等贴图的烘焙功能,使用这些贴图能让低模模型拥有接近高模渲染的效果。

平滑着色

        既然提到了曲面细分,就不得不提一下平滑着色(Smooth Shading),平滑着色其实是和平直着色(Flat Shading)相对的。平直着色是指每个多边形面具有相同的法线,并且只计算一次光照,其值被整个面上的像素共用。

        而平滑着色就是指逐像素插值计算光照,最简单的比如Gouraud 着色Phong 着色,前者是在顶点着色器中计算光照然后插值,后者是在片元着色器中计算光照。在Maya中,切换平滑着色的方法是网格显示->硬化边/软化边,分别对应平直着色(下图左侧)和平滑着色(下图右侧)。

        看右图的表面非常的光滑,你可能会觉得这好像和曲面细分的效果很像。实际上在边缘处稍微注意一下就能看到棱角,为了看的更明显不妨挤出一个面对比:

 

         这里左图是平滑着色的效果,右图是曲面细分的效果。这样看出来曲面细分的效果远比平滑着色更加细腻,这是因为平滑着色只是让多边形面内光照效果均匀变化,既不会增加顶点也不会增加面。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值