проблема тесселяции в DirectX (трещина, разрыв) - PullRequest
0 голосов
/ 25 января 2020

У меня вопрос тесселяции в DirectX. конвейер в коде - это вершинный шейдер -> шейдер корпуса -> доменный шейдер -> пиксельный шейдер, и весь этот конвейер используется для тесселяции двух соседних треугольников (с одним общим ребром), в шейдере Халла все коэффициенты тесселяции установлены равными 1,1, и нет смещения в доменном шейдере, поэтому разделенное общее ребро двух треугольников должно быть точно таким же, но нет, вершины, сгенерированные на общем ребре тесселлятором, не одинаковы. и это приводит к трещине.

образец двух треугольников

{CVector3(-508.000000f,0.000036f,-475.999939f)},
{CVector3(-504.000000f,0.000036f,-475.898834f)},
{CVector3(-504.000000f,0.000036f,-475.999939f)},
{CVector3(-504.000000f,0.000036f,-475.898834f)},
{CVector3(-508.000000f,0.000036f,-475.999939f)},
{CVector3(-507.723114f,0.036412f,-475.715942f)},

код:

cbuffer TessellationBuffer
{
    matrix gWVP;

    float gtessellationAmount;
    float3 padding;
};

struct VertexInputType
{
    float3 position : POSITION;
    float4 color : COLOR;
};

struct HullInputType
{
    float3 position : POSITION;
    float4 color : COLOR;
};

struct ConstantOutputType
{
    float edges[3] : SV_TessFactor;
    float inside : SV_InsideTessFactor;
};

struct HullOutputType
{
    float3 position : POSITION;
    float4 color : COLOR;
    uint patchId : PATCHID;
};

HullInputType VS(VertexInputType input)
{
    HullInputType output;
    output.position = input.position;
    output.color = input.color;
    return output;
}

ConstantOutputType ColorPatchConstantFunction(InputPatch<HullInputType, 3> inputPatch, uint patchId : SV_PrimitiveID)
{    
    ConstantOutputType output;
    output.edges[0] = output.edges[1] = output.edges[2] = output.inside = 1.1;
    return output;
}

[domain("tri")]
[partitioning("fractional_odd")]   //fractional_odd
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("ColorPatchConstantFunction")]
[maxtessfactor(15.0)]
HullOutputType HS(InputPatch<HullInputType, 3> patch, uint pointId : SV_OutputControlPointID, uint patchId : SV_PrimitiveID)
{
    HullOutputType output;
    output.position = patch[pointId].position;
    output.color = patch[pointId].color;    
    output.patchId = patchId;

    return output;
}

struct PixelInputType
{
    float4 position : SV_POSITION;
    float4 color : COLOR;
};

[domain("tri")]
PixelInputType DS(ConstantOutputType input, float3 uvwCoord : SV_DomainLocation, const OutputPatch<HullOutputType, 3> patch)
{
    PixelInputType output;

    float3 vertexPosition = uvwCoord.x * patch[0].position + uvwCoord.y * patch[1].position + uvwCoord.z * patch[2].position;
    output.position = mul(float4(vertexPosition, 1.0f), gWVP);
    output.color = patch[0].color;

    return output;
}

float4 PS(PixelInputType input) : SV_TARGET
{
    return input.color;
}

любая помощь будет оценена, спасибо!

...