曲面细分包括两个可编程的着色器:曲面细分控制着色器(hull shader)和曲面细分计算着色器(domain shader)
曲面细分控制器起到一个数据传递的作用,hull shader做了以下两个工作:
1、决定一个patch需要被细分多少次
2、对于输入的patch数据需要进行哪种特殊的变形
[UNITY_patchconstantfunc(“hsconst”)]中的hsconst是计算factor的方法,在此方法中计算每个边的Tessellation factor和内部的Tessellation factor,以下float4向量中的前三个变量为边factor,最后一个变量为内部factor。外部细分级别是一条线分为几段,内部细分级别的一半是内部环数(偶数是一个点(内部顶点也算一个环)) 2.5算是2 1.5算是1
举例论证
UnityTessellationFactors hsconst(InputPatch<InternalTessInterp_appdata,3> v) {
UnityTessellationFactors o;
float4 tf;
tf = float4(4.0f,4.0f,4.0f,4.0f);
o.edge[0] = tf.x;
o.edge[1] = tf.y;
o.edge[2] = tf.z;
o.inside = tf.w;
return o;
}
#ifdef UNITY_CAN_COMPILE_TESSELLATION
struct UnityTessellationFactors {
float edge[3] : SV_TessFactor;
float inside : SV_InsideTessFactor;
};
#endif // UNITY_CAN_COMPILE_TESSELLATION
#pragma hull hs
UnityTessellationFactors hsconst (InputPatch<InternalTessInterp_appdata,3> v) {
UnityTessellationFactors o;
float4 tf;
tf = float4(4.0f,4.0f,4.0f,4.0f);
o.edge[0] = tf.x;
o.edge[1] = tf.y;
o.edge[2] = tf.z;
o.inside = tf.w;
return o;
}
//指定patch的类型,可选的有:tri、quad、isoline
[UNITY_domain("tri")]
//分割模式可选的有:integer、fractional_even、fractional_odd
[UNITY_partitioning("fractional_odd")]
//图元的生成顺序,也就是图元的朝向,输出拓扑结构可选的有:triangle_cw、triangle_ccw、line
[UNITY_outputtopology("triangle_cw")]
//
[UNITY_patchconstantfunc("hsconst")]
[UNITY_outputcontrolpoints(3)]
InternalTessInterp_appdata hs (InputPatch<InternalTessInterp_appdata,3> v, uint id : SV_OutputControlPointID) {
return v[id];
}
#pragma domain ds
[UNITY_domain("tri")]
v2f ds (UnityTessellationFactors tessFactors, const OutputPatch<InternalTessInterp_appdata,3> vi, float3 bary : SV_DomainLocation) {
appdata v;
v.vertex = vi[0].vertex*bary.x + vi[1].vertex*bary.y + vi[2].vertex*bary.z;
v.tangent = vi[0].tangent*bary.x + vi[1].tangent*bary.y + vi[2].tangent*bary.z;
v.normal = vi[0].normal*bary.x + vi[1].normal*bary.y + vi[2].normal*bary.z;
v.texcoord = vi[0].texcoord*bary.x + vi[1].texcoord*bary.y + vi[2].texcoord*bary.z;
v2f o = vert (v);
return o;
}