Direct3D 11.3 Konservative Rasterisierung

Die konservative Rasterisierung fügt dem Pixelrendering einige Sicherheit hinzu, die insbesondere für Kollisionserkennungsalgorithmen hilfreich sind.

Übersicht

Konservative Rasterisierung bedeutet, dass alle Pixel, die zumindest teilweise von einem gerenderten Grundtyp abgedeckt sind, gerastert werden, was bedeutet, dass der Pixel-Shader aufgerufen wird. Normales Verhalten ist die Stichprobe, die nicht verwendet wird, wenn die konservative Rasterisierung aktiviert ist.

Konservative Rasterisierung ist in einer Reihe von Situationen nützlich, einschließlich der Sicherheit bei der Kollisionserkennung, der Okklusions-Kulling und der Sichtbarkeitserkennung.

Die folgende Abbildung zeigt beispielsweise ein grünes Dreieck, das mithilfe der konservativen Rasterisierung gerendert wird. Der braune Bereich wird als "Unsicherheitsregion" bezeichnet – eine Region, in der Rundungsfehler und andere Probleme unsicherheiten zu den genauen Dimensionen des Dreiecks hinzufügen. Die roten Dreiecke an jedem Vertex zeigen, wie die Unsicherheitsregion berechnet wird. Die großen grauen Quadrate zeigen die Pixel an, die gerendert werden. Die rosa Quadrate zeigen Pixel an, die mithilfe der "oben-linken Regel" gerendert werden, die als Rand des Dreiecks den Rand der Pixel kreuzt. Es kann falsch positive Ergebnisse (Pixel festgelegt sein, die nicht vorhanden sein sollten), die das System normalerweise aber nicht immer ullt.

shows the top left rule

Interaktionen mit der Pipeline

Viele Details dazu, wie die konservative Rasterisierung mit der Grafikpipeline interagiert, finden Sie unter D3D12 Konservative Rasterisierung.

Details zur Implementierung

Der In Direct3D 12 unterstützte Rasterisierungstyp wird manchmal als "überschätzte konservative Rasterisierung" bezeichnet. Es gibt auch das Konzept der "unterschätzten konservativen Rasterisierung", was bedeutet, dass nur Pixel, die vollständig von einem gerenderten Grundtyp abgedeckt sind, gerastert werden. Über die Verwendung von Eingabeabdeckungsdaten steht die konservative Rasterisierungsinformationen über den Pixel-Shader zur Verfügung, und nur die überschätzte konservative Rasterisierung ist als Rasterungsmodus verfügbar.

Wenn ein Teil eines Grundtyps ein Pixel überlappen, wird dieses Pixel als abgedeckt betrachtet und anschließend gerastert. Wenn ein Rand oder eine Ecke eines Grundtyps entlang des Rands oder der Ecke eines Pixels fällt, ist die Anwendung der "oben links"-Regel implementierungsspezifisch. Für Implementierungen, die entgenerte Dreiecke unterstützen, muss jedoch ein entgeneriertes Dreieck entlang eines Rands oder einer Ecke mindestens ein Pixel umfassen.

Konservative Rasterisierungsimplementierungen können auf unterschiedlicher Hardware variieren und falsche positive Ergebnisse erzeugen, was bedeutet, dass sie falsch entscheiden können, dass Pixel abgedeckt werden. Dies kann aufgrund von implementierungsspezifischen Details auftreten, z. B. Grundtypen, die wachsen oder anknocken, die in der Rasterisierung verwendet werden. Der Grund für falsch positive Ergebnisse (in Bezug auf fixe Punkt-Vertexkoordinaten) ist gültig, da einige falsch positive Ergebnisse erforderlich sind, um eine Implementierung zu ermöglichen, eine Abdeckungsbewertung gegen postgerackte Vertexkoordinaten (d. h. Vertexkoordinaten, die von Gleitkommakoordinaten in den 16,8-Fixpunkt konvertiert wurden, die im Rasterizer verwendet wurden), aber die abdeckung zu berücksichtigen, die von den ursprünglichen Gleitkommakoordinaten erzeugt wurde.

Konservative Rasterisierungsimplementierungen erzeugen keine falschen Negativen im Hinblick auf die Gleitkommakoordinaten für nicht degenerierte Post-Snap-Grundtypen: Wenn ein Teil eines Grundtyps einen Teil eines Pixels überlappen, wird dieses Pixel gerastert.

Dreiecke, die degeneriert werden (duplizierte Indizes in einem Indexpuffer oder Collinear in 3D), oder werden nach der Konvertierung fester Punkt (Collinear Vertices im Rasterizer) degeneriert, kann oder nicht geullt werden; beide sind gültige Verhaltensweisen. Degenerierte Dreiecke müssen als rückgesichtig betrachtet werden, sodass ein bestimmtes Verhalten von einer Anwendung benötigt wird, kann er rückseitige Kulling oder Test für frontseitiges Gesicht verwenden. Entgenerierte Dreiecke verwenden die Werte, die Vertex 0 für alle interpolierten Werte zugewiesen sind.

Neben der Möglichkeit, dass die Hardware diese Funktion nicht unterstützt, gibt es drei Hardwarestufen.

  • Die Stufe 1 unterstützt 1/2 Pixel-Unsicherheitsbereiche und keine Post-Snap-Degeneate. Dies eignet sich gut für das Kachelrendern, einen Texturatlas, eine Lichtkarte und Unter-Pixel-Schattenkarten.
  • Die Stufe 2 fügt post-snap degenerate und 1/256-Unsicherheitsregionen hinzu. Außerdem wird die CPU-basierte Algorithmusbeschleunigung (z. B. Voxelization) unterstützt.
  • Die Ebene 3 fügt 1/512 Unsicherheitsregionen, innere Eingabeabdeckung und unterstützt Die Okklusions-Kulling. Die Eingabeabdeckung fügt den neuen Wert SV_InnerCoverage zur Schattierungssprache "High Level Shading Language" (HLSL) hinzu. Dies ist eine 32-Bit-Skalarzahl, die bei eingaben einem Pixel-Shader angegeben werden kann, und stellt die geschätzten konservativen Rasterisierungsinformationen dar (das heißt, ob ein Pixel garantiert-zu-voll abgedeckt ist).

API-Zusammenfassung

Die folgenden Methoden, Strukturen, Aufzählungen und Hilfsklassen verweisen auf konservative Rasterisierung: