DirectX 12 曲面细分—域着色器

域着色器

在镶嵌化阶段之后是域着色器,镶嵌器会输出新建的所有顶点和三角形,域着色器接收的是曲面细分因子控制点(外壳着色器输出)镶嵌处理后的顶点参数坐标(u,v),域着色器接收到的位置不是实际的位置而是相对位置。

顶点参数坐标
其中所有点的实际位置都可通过控制点推算出来,下面的代码中,则通过控制点进行插值计算出所有点的实际位置,(u,v)参数坐标都是属于0~1之间的。

[domain("quad")]
DomainOut DS(PatchTess patchTess, 
             float2 uv : SV_DomainLocation, 
             const OutputPatch<HullOut, 4> quad)
{
	DomainOut dout;
	
	// Bilinear interpolation.
	float3 v1 = lerp(quad[0].PosL, quad[1].PosL, uv.x); 
	float3 v2 = lerp(quad[2].PosL, quad[3].PosL, uv.x); 
	float3 p  = lerp(v1, v2, uv.y); 
	
	float4 posW = mul(float4(p, 1.0f), gWorld);
	dout.PosH = mul(posW, gViewProj);
	
	return dout;
}

注意!每个点都会调用域着色器会一次,域着色器的本质其实就是处理镶嵌化后的“顶点着色器”。
以上为四边形在域着色器中的表示方法,三角形的表示方法则有点不一样但很类似,其中的顶点类型为float3的重心坐标(u,v,w)来表示,以此作为域着色器的输入从而替代参数坐标(u,v)。

三角形重心

三角形的重心:p(s,t)=p0+s(p1-p0)+t(p2-p0)=(1-s-t)p0+sp1+tp2,令r=1-s-t,p(s,t)=rp0+sp1+tp2

重心坐标为(r,s,t),所以上面的uv应该被定义成uvw并且等于三角形的重心。

picture

未经允许不得转载:他日重逢 » DirectX 12 曲面细分—域着色器

赞 (1) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏

隐藏
变装