Windows Phone 8 – DrawIndexedPrimitives rendert nicht

Die mobile Denkfabrik  –  0 Kommentare

Wer von XNA auf Direct3D umsteigt, muss sich über kurz oder lang mit der Frage nach der Modell-Datenhaltung befassen. Beim Erstellen der Modellklasse möchte man manchmal einen Funktionstest machen, der allzu oft mit einem "leeren Bildschirm" endet.

Hierfür gibt es einige klassische Ursachen. Einfache Tippfehler lassen sich oft ausschließen, indem man während der Ausführung des Programms einen Blick in das Output-Panel wirft. Die Debug-Version von Direct3D wird einen geradezu mit Feedback erschlagen, wenn "Unregelmäßigkeiten" auftreten.

Die meisten Grafikchips nutzen eine als Culling bezeichnete Methode zur Minimierung der Render-Last. Wenn die Reihenfolge der Vertizes nicht stimmt, erscheint nichts am Bildschirm – als Workaround für dieses Problem bietet sich das vorübergehende Deaktivieren des Cullings an.

Zu guter Letzt sorgt die Parametrierung der Projektionsmatrix immer wieder mal für Unruhe. Der folgende Code führt zur Laufzeit zu diversen Problemen:

XMStoreFloat4x4(
&myConstantBuffer.projection,
XMMatrixTranspose(
XMMatrixPerspectiveFovRH(
fovAngleY,
aspectRatio,
-0.01f,
10.0f
)
)
);

Richtig sieht das Ganze so aus:

XMStoreFloat4x4(
&myConstantBuffer.projection,
XMMatrixTranspose(
XMMatrixPerspectiveFovRH(
fovAngleY,
aspectRatio,
0.01f,
10.0f
)
)
);

Das Übergeben eines negativen Werts für die "hintere" Schwelle des Projektionsbereich führt – je nach Größe des Werts – zu diversen numerischen Instabilitäten in der Pipeline. Neben einem schwarzen Bildschirm lassen sich sich auf diese Art und Weise auch "seltsame" Ausgaben" anzüchten, die sich nicht ohne Weiteres erklären lassen.