一、前言
通过hull shader的转换控制点和UV坐标生成表面几何,对于固定的细分曲面生成的点都将调用Domain Shader, 输入为:UV[W]坐标,已经Hull Shader的所有输出数据
二、定义Domain 属性
[domain("quad")] // 四边形
三、通过domain定位 Hull上的位置
- 对于四边形的patch,使用float2
- 对于三重曲面patch,使用float3(用于重心坐标)
- 对于isoline,使用float2
float2 UV : SV_DomainLocation
四、定义其他的输入--来自hull shader 由用户定义,包括每个patch的输入控制点(1~32个),输出常量patch数据
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch
HS_CONSTANT_DATA_OUTPUT input
五、添加用户自定义的代码计算输出---domain shader主体
// domain shader outputs
struct DS_OUTPUT
{
float3 vNormal : NORMAL;
float2 vUV : TEXCOORD;
float3 vTangent : TANGENT;
float3 vBiTangent : BITANGENT;
float4 vPosition : SV_POSITION;
};
// 获取输入的UV
[domain("quad")]
DS_OUTPUT BezierEvalDS( HS_CONSTANT_DATA_OUTPUT input,
float2 UV : SV_DomainLocation,
const OutputPatch<BEZIER_CONTROL_POINT, 16> bezpatch )
{
DS_OUTPUT Output;
// Insert code to compute the output here.
return Output;
}