У меня вопрос тесселяции в 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;
}
любая помощь будет оценена, спасибо!