UnityShader曲⾯细分简介
⽬录
Unity Shader 曲⾯细分简介
概念介绍
曲⾯细分⼀种对输⼊的图元(三⾓形、四边形、线段)进⾏细化,产⽣出更多的顶点,使其变得更精细的技术。
这⼀功能在渲染管线中完成,通常会由显卡硬件⽀持。从阶段上讲它位于顶点着⾊器之后,像素着⾊器之前。
它的内部流程分为三部分:可编程的Hull Shader(控制细分参数),不可编程的Generator(细分顶点),可编程的Domain Shader(顶点位置计算)。
因此,它基于顶点着⾊器阶段后的顶点数据,并可以控制⽣成更多的顶点数据交由像素着⾊器使⽤。
作⽤
曲⾯细分技术降低了模型精细度要求,在模型制作、存储、加载上都可带来节省。
通过曲⾯细分⽣成更精细的顶点后,可以应⽤“置换贴图”技术来渲染出更加精细、逼真的模型。
置换贴图不同于法线贴图修改顶点的法线⽅向来造成光影错觉,它会真正修改顶点的位置来产⽣凹凸感,因此当视线与⽹格切⾯⽅向接近时法线贴图基本上失效⽽置换贴图仍可产⽣逼真的效果。
例如以下分别是【标准】材质、【未细分仅置换】材质、【固定数⽬细分置换】材质的效果:
关于Unity⽀持
unity⽂档⾥只提了Built-in Render Pipeline的Surface Shader⽀持曲⾯细分,并且只⽀持三⾓形。同时它需要Shader Model 4.6target,因此不⽀持更⽼的设备。
官⽅案例
在使⽤Surface Shader的前提下使⽤曲⾯细分⾮常简单,以下的每种细分⽅法都提供了内置的函数,直接调⽤就完事。
总的来说是在shader中增加两个函数:
tessellate:FunctionName
vertex:FunctionName
tessellate声明的函数返回细分控制参数,这是⼀个float4类型,前三个值分别表⽰输⼊三⾓形的三个边被分成⼏段,第四个值是Inside因⼦,算法使⽤,不太清楚。
vertex声明的函数可以拿到细分后的所有顶点,可以在这⾥修改其位置。
例图:
不细分,仅顶点置换
和上图不同之处在于,它只声明了vertex函数,未声明tessellate函数,因此它仅在vertex函数中采样了置换图然后修改顶点位置。
固定细分和顶点置换scull
例图中就是这个⽰例,它在tessellate函数中返回了⼀个固定的细分因⼦,因此它产⽣的细分数量是固定
的。
基于距离的细分和顶点置换
它的效果就是当物体离相机近时细分增多,当离相机远时细分减少。
它的tessellate函数略有不同了,多了三个参数。这三个参数就是原三⾓形的三个顶点,⾥⾯⼜调⽤了UnityDistanceBasedTess⽅法,这个⽅法会计算每个顶点与相机的距离,最终⽣成细分因⼦。
基于边长的细分和顶点置换
上⾯的其于距离细分只能⽤于所有三⾓⾯都差不多⼤的情况,否则细分就不均匀。
因此,UnityEdgeLengthBasedTess基于边长⽣成细分因⼦,更⼤的三⾓形将细分成更多三⾓形。
Unity还提供了替代⽅法UnityEdgeLengthBasedTessCull,它会额外计算相机的可视范围裁剪,减少参与细分的三⾓形数量,当⽹格会有很多部分在视野外时,应使⽤这个⽅法。
冯⽒曲⾯细分
这个的效果就是会让细分后的⾯向⽹格法线⽅向外移⼀点点,这会使得⽹格变得更加光滑,因此⽤于lo
w-poly模型时效果不错。
这个更简单了,不需要提供vertex函数⽽是指定了⼀个tessphong的float值控制强度,Unity⾃动完成顶点修改。
更多
虽然⽂档化的只有Surface Shader,实际上也⽀持更灵活的顶点\像素shader,只是需要去看Surface Shader的⽣成代码总结规律。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论