Tessellation shader

本文介绍了计算机图形学中曲面细分的概念及其实现细节。通过曲面细分控制着色器(hullshader)和曲面细分计算着色器(domainshader),可以实现对几何体的精细控制。文中详细解释了如何通过hullshader中的函数计算Tessellation factor,并给出了具体的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

曲面细分包括两个可编程的着色器:曲面细分控制着色器(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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值