无法编译 HLSL Hull 着色器代码

Can't compile HLSL Hull shader code

这是我制作的一个简单的船体着色器代码,用于尝试理解曲面细分。 我只是找不到这段代码有什么问题,但是编译函数总是 return false。这是我的代码:

我的输入输出结构:

 [domain("tri")] // indicates a triangle patch (3 verts) 
[partitioning("fractional_odd")] // fractional avoids popping 
// vertex ordering for the output triangles 
[outputtopology("triangle_cw")] 
[outputcontrolpoints(3)] 
// name of the patch constant hull shader 
[patchconstantfunc("ConstantsHS")] 
//[maxtessfactor(7.0)]


cbuffer TessellationBuffer
{
    float tessellationAmount;
    float3 padding;
};

struct VS_CONTROL_POINT_OUTPUT
{
    float3 vWorldPos : POSITION;
    float2 vTexCoord : TEXCOORD0;
    float3 vNormal : NORMAL0;
};

struct HS_CONTROL_POINT_OUTPUT
{
    float3 vWorldPos : POSITION;
    float2 vTexCoord : TEXCOORD0;
    float3 vNormal : NORMAL0;
};

struct HS_CONSTANT_DATA_OUTPUT
{
    float Edges[3] : SV_TessFactor;
    float Inside : SV_InsideTessFactor;
};

我的职能:

HS_CONTROL_POINT_OUTPUT HS(InputPatch<VS_CONTROL_POINT_OUTPUT, 3> inputPatch, uint uCPID : SV_OutputControlPointID, uint patchId : SV_PrimitiveID )
{
    HS_CONTROL_POINT_OUTPUT Output;
    Output.vWorldPos = inputPatch[uCPID].vWorldPos;
    Output.vTexCoord = inputPatch[uCPID].vTexCoord; 
    Output.vNormal = inputPatch[uCPID].vNormal; 

    return Output;
};

HS_CONSTANT_DATA_OUTPUT ConstantsHS(InputPatch<VS_CONTROL_POINT_OUTPUT, 3> inputPatch, uint PatchID : SV_PrimitiveID  )
{
    HS_CONSTANT_DATA_OUTPUT Output;

    Output.Edges[0] = tessellationAmount;
    Output.Edges[1] =  tessellationAmount; 
    Output.Edges[2] = tessellationAmount; 
    Output.Inside   = tessellationAmount; 
    return Output;
};

感谢您的帮助。

必须像下面这样在入口点设置属性,然后你的外壳着色器才有效:

[domain("tri")] // indicates a triangle patch (3 verts) 
[partitioning("fractional_odd")] // fractional avoids popping 
// vertex ordering for the output triangles 
[outputtopology("triangle_cw")] 
[outputcontrolpoints(3)] 
// name of the patch constant hull shader 
[patchconstantfunc("ConstantsHS")] 
//[maxtessfactor(7.0)]
HS_CONTROL_POINT_OUTPUT HS(InputPatch<VS_CONTROL_POINT_OUTPUT, 3> inputPatch, uint uCPID : SV_OutputControlPointID, uint patchId : SV_PrimitiveID )

附带说明一下,命令行工具 FXC.exe 会打印一条错误消息,让您走上正确的方向:error X3000: syntax error: unexpected token 'cbuffer'

而且我不确定你指的是什么函数,D3DCompile return a HRESULT,不是布尔值,它还会为你输出一个带有错误消息的 blob以防失败。