PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : D3D11 Tesselation: Minimalfall funktioniert nicht


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?

Demirug
2010-08-08, 15:01:33
Patches bei denen mindestens ein edge factor <= 0 ist werden gecullt.

Coda
2010-08-08, 15:02:45
Es funktioniert auch mit "float tess_amount = 1.0f" nicht. Leider ist das nicht das Problem.

Demirug
2010-08-08, 15:14:09
Was ist denn mit deiner W Koordinate bei der Position?

Btw: Normalerweise sollte man die Tesselation mit Welt Koordinaten durchführen und die Projektion im Domainshader machen.

Coda
2010-08-08, 15:22:44
Was ist denn mit deiner W Koordinate bei der Position?
Die sollte doch vom Input Assembler automatisch mit 1 belegt werden?

Btw: Normalerweise sollte man die Tesselation mit Welt Koordinaten durchführen und die Projektion im Domainshader machen.
Ja, aber das spielt hier doch auch keine Rolle? Ich probier's aber mal.

Coda
2010-08-08, 15:48:55
Ändert beides nichts.

Muss ich von der API-Seite denn noch irgend was konfigurieren außer die Shader setzen und die Topologie?

Coda
2010-08-09, 00:26:15
Als Tipp bis PIX D3D11 wirklich unterstützt: Ich habe einen Geometry-Shader eingefügt, der nichts macht außer die Dreiecke durchzureichen. Dadurch hat PIX mir dann endlich die Ausgabe angezeigt.

Das Problem war, dass meine Kamera-Klasse die MVP-Matrix nicht gesetzt hat für Hull- und Domain-Shader, deshalb hat der DS einfach mit 0 multipliziert. Blöder Fehler wie gedacht.

Neomi
2010-08-09, 10:13:43
Wie kann das Problem denn eine fehlende Matrix sein, wenn du weder im HS noch im DS mit einer Matrix multiplizierst? Oder meinst du jetzt nicht den geposteten Minimalfall, sondern den mit der umgelagerten Transformation? Wenn dort nur die Matrix alleine das Problem war, hätte es ja mit dem geposteten Code mit geändertem Tesselationsfaktor schon funktionieren müssen.

Coda
2010-08-09, 15:57:26
Wie kann das Problem denn eine fehlende Matrix sein, wenn du weder im HS noch im DS mit einer Matrix multiplizierst?
Ich mach das jetzt im Domain-Shader, so wie von Demirug vorgeschlagen.

Was dann dazu geführt hat, dass es im Hull-Shader nicht funktioniert hat kann ich jetzt auch nicht mehr nachvollziehen. Evtl. hat da auch noch etwas anderes reingespielt.

Nasenbaer
2010-08-12, 15:02:59
Weiß eigentlich jemand was die unterschiedlichen Werte von

[partitioning("X")]

bedeuten? Die SDK-Doku ist da ziemlich wortkarg und listet nur die möglichen Werte auf. :/

Coda
2010-08-12, 15:18:55
Bei "integer" macht er nur ganzzahlige splits, "fractional_even" und "fractional_odd" sind unterschiedliche Verfahren eine ungerade Anzahl anzuordnen.

pow2 könnte nur Splits in der Reihe 1, 2, 4, 8, etc. zulassen, da bin ich mir aber nicht sicher.

Nasenbaer
2010-08-12, 18:58:46
Bei "integer" macht er nur ganzzahlige splits, "fractional_even" und "fractional_odd" sind unterschiedliche Verfahren eine ungerade Anzahl anzuordnen.

pow2 könnte nur Splits in der Reihe 1, 2, 4, 8, etc. zulassen, da bin ich mir aber nicht sicher.
Hab mir mal fix ne kleine TestApp dazu gebastelt:

Integer
Findet immer nur eine ganzzahlige Unterteilung statt. Ein gebrochener Tesselation-Factor wird quasi per floor() zur Ganzzahl.

fractional_even, fractional_odd
Bei ganzen Zahlen sind die Ergebnisse mit Integer vergleichbar. Ist SV_TessFactor ein Kommawert, so verschieben sich die UV-Koordinaten mit steigendem Nachkommawert in die Position, die sie bei der nächst höheren Ganzzahl haben.
Ist somit ideal um Geomorphing bei LOD zu integrieren.

pow2
Hab da per draufschauen keinen Unterschied zu Integer feststellen können.

Coda
2010-08-12, 19:01:51
Das hab ich doch geschrieben.

Nasenbaer
2010-08-12, 19:06:28
Das hab ich doch geschrieben.
Naja du warst dir bei pow2 nicht sicher und das mit "fractional_*" hatte ich nicht so recht verstanden. Deswegen wollt ich nur mal mitteilen, was ich rausfinden konnte zu diesen beiden. :)

Coda
2010-08-12, 19:09:48
Naja, das mit pow2 ist immer noch nicht geklärt.

Nasenbaer
2010-08-12, 19:31:02
Naja, das mit pow2 ist immer noch nicht geklärt.
Jo.

Ich hab noch das dazugehörige Patent von MS auftreiben können (diese Seite (http://www.wipo.int/pctdb/en/wo.jsp?WO=2009099703&IA=US2009030533&DISPLAY=DOCS) und dann das PDF "Initial Publication without ISR (A2 33/2009)")
aber daraus werde ich jedenfalls auch nicht schlauer. Es beschreibt es genau so wie du vermutest aber faktisch tuts das ja nicht. ;D

EDIT: die entsprechende Stelle ist [0040] im PDF.