mondlicht
mondlicht

Reputation: 3

Can't compile HLSL Hull shader code

Here's a simple hull shader code that i made, to try to understand tessellation. I just can't find anything wrong with this code, but the compile function always return false. Here's my code:

My input and output structures:

 [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;
};

My functions:

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;
};

Thanks for any help.

Upvotes: 0

Views: 378

Answers (1)

galop1n
galop1n

Reputation: 8824

The attributes have to be set on the entry point like below, then your hull shader is valid :

[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 )

On a side note, The command line tool FXC.exe would have print an error message that would have put you in the right direction : error X3000: syntax error: unexpected token 'cbuffer'

And i am unsure of what function you are referring to, D3DCompile return a HRESULT, not a boolean, and it also output a blob for you with the error messages in case of failure.

Upvotes: 1

Related Questions