Tessellation shader

曲面细分包括两个可编程的着色器:曲面细分控制着色器(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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
细分shader和几何shader是计算机图形学中的两种重要的着色器类型。 细分shaderTessellation Shader)是一种用于进行细分操作的着色器。它可以将输入的三角形网格进行细分,并生成更高分辨率的三角形网格。细分shader通常用于提高曲面细节的展示效果。通过在输入的三角形上插入新的顶点,并对这些顶点进行位置调整,细分着色器可以产生更加平滑的曲面细节,并增加模型的细节级别。细分shader常用于模型细分细节的增强,如地形细分、角色细分和曲面细分等。 几何shader(Geometry Shader)是在细分shader之后执行的着色器。细分shader生成的细分网格会进一步传递给几何shader。几何shader可以对输入的三角形网格进行操作,包括增加、删除和改变顶点的属性。通过几何shader,我们可以对模型进行各种形状的变换和处理,如通过给三角形添加顶点产生更多的几何图元,或者通过删除顶点合并多个三角形。几何shader在进一步处理模型形状、拆分或合并模型几何体、调整三角形顶点属性等方面具有极大的灵活性。它可以在多个输入图元之间进行交互,并能够生成不同类型的图元作为输出。 综上所述,细分shader和几何shader是在计算机图形学中常用的两种着色器类型。细分shader用于增加模型的细节级别,而几何shader用于对模型的形状进行操作和变换。它们在计算机图形学中扮演着重要的角色,为实时渲染和图形处理提供了更大的灵活性和细节控制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值