Coda
2010-08-08, 14:32:37
Ich spiele gerade bisschen mit D3D11 rum, und bin auf ein Problem gestoßen, bei dem ich offensichtlich ein Brett vor dem Kopf habe.
Ich habe Hull-Shader und Domain-Shader so entworfen, dass sie theoretisch gar nichts machen sollten, d.h. einfach nur ein Dreieck rauskommt für ein Dreieck als Eingabe.
Wenn ich HS und DS nicht setze und als Topologie D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST wähle rendert das ganze wunderbar. Andernfalls mit Tesselation und D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST ist überhaupt nichts zu sehen. PIX kann offenbar leider noch keine Hull- und Domain-Shader debuggen.
Code:
Strukturen:
struct VSInput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
struct VSOutput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
struct HSConstantDataOutput
{
float edges[3] : SV_TessFactor;
float inside : SV_InsideTessFactor;
};
struct HSOutput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
struct DSOutput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
Vertex Shader:
VSOutput main(VSInput input)
{
VSOutput output;
output.position = mul(input.position, mvp);
output.texcoord = input.texcoord;
return output;
}
Hull Shader:
HSConstantDataOutput constantHS(InputPatch<VSOutput, 3> input_patch, uint patch_id : SV_PrimitiveID)
{
HSConstantDataOutput output;
float tess_amount = 0.0f;
output.edges[0] = output.edges[1] = output.edges[2] = tess_amount;
output.inside = tess_amount;
return output;
}
[domain("tri")]
[partitioning("integer")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("constantHS")]
HSOutput main(InputPatch<VSOutput, 3> patch, uint i : SV_OutputControlPointID, uint patch_id : SV_PrimitiveID)
{
HSOutput output;
output.position = patch[i].position;
output.texcoord = patch[i].texcoord;
return output;
}
Domain Shader:
[domain("tri")]
DSOutput main(HSConstantDataOutput input, float3 uvw : SV_DomainLocation, const OutputPatch<HSOutput, 3> patch)
{
DSOutput output;
output.position = uvw.x * patch[0].position + uvw.y * patch[1].position + uvw.z * patch[2].position;
output.texcoord = uvw.x * patch[0].texcoord + uvw.y * patch[1].texcoord + uvw.z * patch[2].texcoord;
return output;
}
Pixel Shader:
float4 main(DSOutput input) : SV_Target
{
return float4(1.0f, 1.0f, 1.0f, 0.0f);
}
Sieht jemand das Problem?
Ich habe Hull-Shader und Domain-Shader so entworfen, dass sie theoretisch gar nichts machen sollten, d.h. einfach nur ein Dreieck rauskommt für ein Dreieck als Eingabe.
Wenn ich HS und DS nicht setze und als Topologie D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST wähle rendert das ganze wunderbar. Andernfalls mit Tesselation und D3D11_PRIMITIVE_TOPOLOGY_3_CONTROL_POINT_PATCHLIST ist überhaupt nichts zu sehen. PIX kann offenbar leider noch keine Hull- und Domain-Shader debuggen.
Code:
Strukturen:
struct VSInput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
struct VSOutput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
struct HSConstantDataOutput
{
float edges[3] : SV_TessFactor;
float inside : SV_InsideTessFactor;
};
struct HSOutput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
struct DSOutput
{
float4 position : SV_POSITION;
float2 texcoord : TEXCOORD;
};
Vertex Shader:
VSOutput main(VSInput input)
{
VSOutput output;
output.position = mul(input.position, mvp);
output.texcoord = input.texcoord;
return output;
}
Hull Shader:
HSConstantDataOutput constantHS(InputPatch<VSOutput, 3> input_patch, uint patch_id : SV_PrimitiveID)
{
HSConstantDataOutput output;
float tess_amount = 0.0f;
output.edges[0] = output.edges[1] = output.edges[2] = tess_amount;
output.inside = tess_amount;
return output;
}
[domain("tri")]
[partitioning("integer")]
[outputtopology("triangle_cw")]
[outputcontrolpoints(3)]
[patchconstantfunc("constantHS")]
HSOutput main(InputPatch<VSOutput, 3> patch, uint i : SV_OutputControlPointID, uint patch_id : SV_PrimitiveID)
{
HSOutput output;
output.position = patch[i].position;
output.texcoord = patch[i].texcoord;
return output;
}
Domain Shader:
[domain("tri")]
DSOutput main(HSConstantDataOutput input, float3 uvw : SV_DomainLocation, const OutputPatch<HSOutput, 3> patch)
{
DSOutput output;
output.position = uvw.x * patch[0].position + uvw.y * patch[1].position + uvw.z * patch[2].position;
output.texcoord = uvw.x * patch[0].texcoord + uvw.y * patch[1].texcoord + uvw.z * patch[2].texcoord;
return output;
}
Pixel Shader:
float4 main(DSOutput input) : SV_Target
{
return float4(1.0f, 1.0f, 1.0f, 0.0f);
}
Sieht jemand das Problem?