一、定义Hull Shader 输入、输出
// input control
struct 在VS_CONTROL_POINT_OUTPUT // 怀疑写错了。。为啥不是_INPUT
{
float3 vPosition : WORLDPOS;
float2 vUV : TEXCOORD0;
float3 vTangent : TANGENT;
};
// Output control
struct BEZIER_CONTROL_POINT
{
float3 vPosition : BEZIERPOS;
};
二、定义output patch constant data.
struct HS_CONSTANT_DATA_OUTPUT
{
float Edges[4] : SV_TessFactor;
float Inside[2] : SV_InsideTessFactor;
float vTangent[4] : TANGENT;
float vUV[4] : TEXCOORD;
float vTanUCorner[4] : TANUCORNER;
float vTanVCorner[4] : TANVCORNER;
float vCWts : TANWEIGHTS;
};
三、创建补丁常量函数
#define MAX_POINTS 32
// Patch Constant Function
HS_CONSTANT_DATA_OUTPUT SubDToBezierConstantsHS(
InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip,
uint PatchID : SV_PrimitiveID )
{
HS_CONSTANT_DATA_OUTPUT Output;
// Insert code to compute Output here
return Output;
}
注: 修补函数属性:
a、patch ID,SV_PrimitiveID系统表示
b、输入控制点,在VS_CONTROL_POINT_OUTPUT 中声明
c、SV_TessFactor定义的用于计算的tessellation factors,四边形需要四个tessellation factors 和 两个其他因子(SV_InsideTessFactor)
d、输出结构体,并由HS_CONSTANT_DATA_OUTPUT 标识,不同的类型 结构不同
四、定义Hull shader
[domain("quad")]
[partitioning("integer")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(16)]
[patchconstantfunc("SubDToBezierConstantsHS")]
BEZIER_CONTROL_POINT SubDToBezierHS( InputPatch<VS_CONTROL_POINT_OUTPUT, MAX_POINTS> ip,
uint i : SV_OutputControlPointID,
uint PatchID : SV_PrimitiveID )
{
VS_CONTROL_POINT_OUTPUT Output;
// Insert code to compute Output here.
return Output;
}
// 属性:
domain // 域属性
partitioning // 分区属性
outputtopology // 输出pology
outputcontrolpoints // 输出控制点
patchconstantfunc // 常量补丁函数--计算输出控制点
795

被折叠的 条评论
为什么被折叠?



