设计Hull Shader

一、定义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         // 常量补丁函数--计算输出控制点
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值