Freigeben über


Direct3D 11.3 Konservative Rasterung

Bei der konservativen Rasterung wird dem Pixelrendering etwas Sicherheit hinzugefügt, was insbesondere bei Kollisionserkennungsalgorithmen hilfreich ist.

Überblick

Konservative Rasterung bedeutet, dass alle Pixel, die mindestens teilweise von einem gerenderten Grundtyp abgedeckt sind, gerastert werden, was bedeutet, dass der Pixelshader aufgerufen wird. Normales Verhalten ist Sampling, das nicht verwendet wird, wenn die konservative Rasterung aktiviert ist.

Konservative Rasterung ist in einer Reihe von Situationen nützlich, einschließlich sicherheit bei der Kollisionserkennung, Okklusions-Culling und Sichtbarkeitserkennung.

Die folgende Abbildung zeigt z. B. ein grünes Dreieck, das mit konservativer Rasterung gerendert wird. Der braune Bereich wird als "Unsicherheitsregion" bezeichnet – eine Region, in der Rundungsfehler und andere Probleme die genauen Dimensionen des Dreiecks unsicher machen. Die roten Dreiecke an jedem Scheitelpunkt zeigen, wie der Unsicherheitsbereich berechnet wird. Die großen grauen Quadrate zeigen die Pixel an, die gerendert werden. Die rosa Quadrate zeigen Pixel an, die mit der "Regel oben links" gerendert werden, die als Rand des Dreiecks den Rand der Pixel überschreitet. Es können falsch positive Ergebnisse (Pixel festgelegt werden, die nicht vorhanden sein sollten), die das System normalerweise, aber nicht immer ulliert.

zeigt die oben linke Regel

Interaktionen mit der Pipeline

Ausführliche Informationen dazu, wie konservative Rasterung mit der Grafikpipeline interagiert, finden Sie unter D3D12 Konservative Rasterung.

Implementierungsdetails

Die in Direct3D 12 unterstützte Rasterungsart wird manchmal als "überschätzte konservative Rasterung" bezeichnet. Es gibt auch das Konzept der "unterschätzten konservativen Rasterung", was bedeutet, dass nur Pixel, die vollständig von einem gerenderten Grundtyp abgedeckt sind, gerastert werden. Unterschätzte konservative Rasterungsinformationen sind über den Pixelshader über die Verwendung von Eingabeabdeckungsdaten verfügbar, und nur die überschätzte konservative Rasterung ist als Rasterungsmodus verfügbar.

Wenn ein Teil eines Grundtyps ein Pixel überlappt, wird dieses Pixel als abgedeckt betrachtet und dann gerastert. Wenn ein Rand oder eine Ecke eines Grundtyps entlang der Kante oder Ecke eines Pixels fällt, ist die Anwendung der "oben links"-Regel implementierungsspezifisch. Bei Implementierungen, die entgenerte Dreiecke unterstützen, muss jedoch ein entgenerates Dreieck entlang eines Rands oder einer Ecke mindestens ein Pixel umfassen.

Konservative Rasterungsimplementierungen können auf unterschiedlicher Hardware variieren und falsch positive Ergebnisse erzeugen, was bedeutet, dass sie fälschlicherweise entscheiden können, dass Pixel abgedeckt werden. Dies kann aufgrund von implementierungsspezifischen Details wie primitiven Wachsenden oder Andockfehlern auftreten, die den in der Rasterung verwendeten Vertexkoordinaten mit festen Punkten inhärent sind. Der Grund für falsch positive Ergebnisse (in Bezug auf Vertexkoordinaten mit festen Punkten) ist gültig, da einige falsch positive Ergebnisse erforderlich sind, um eine Implementierung zu ermöglichen, die Abdeckung mit postgedockten Scheitelpunkten (d. h. Vertexkoordinaten, die von Gleitkommakoordinaten in den 16,8-Festenpunkt konvertiert wurden, der im Rasterizer verwendet wird), aber berücksichtigen Sie die Abdeckung, die von den ursprünglichen Gleitkommavertexkoordinaten erzeugt wird.

Konservative Rasterungsimplementierungen erzeugen keine falschen Negativen in Bezug auf die Gleitkommavertexkoordinaten für nicht degenerierte Post-Snap-Grundtypen: Wenn ein Teil eines Grundtyps einen Teil eines Pixels überlappt, wird dieses Pixel gerastert.

Dreiecke, die degeneriert sind (doppelte Indizes in einem Indexpuffer oder Collinear in 3D) oder werden nach der Konvertierung mit festem Punkt (kollineare Scheitelpunkte im Rasterizer) degeneriert oder nicht gekullt; beide sind gültige Verhaltensweisen. Degenerate Dreiecke müssen als nach hinten gerichtet betrachtet werden. Wenn also ein bestimmtes Verhalten für eine Anwendung erforderlich ist, kann sie das Culling der Rückseite oder den Test für die Vorderseite verwenden. Degenerierte Dreiecke verwenden die Werte, die Vertex 0 für alle interpolierten Werte zugewiesen sind.

Zusätzlich zur Möglichkeit, dass die Hardware dieses Feature nicht unterstützt, gibt es drei Ebenen der Hardwareunterstützung.

  • Stufe 1 unterstützt 1/2 Pixel-Unsicherheitsbereiche und keine Post-Snap-Degeneate. Dies eignet sich gut für das nebeneinander angeordnete Rendering, einen Texturatlas, eine Lichtkartengenerierung und Schattenkarten mit Unterpixeln.
  • Stufe 2 fügt Post-Snap-Entgeneigte und 1/256-Unsicherheitsregionen hinzu. Außerdem wird unterstützung für cpubasierte Algorithmusbeschleunigung (z. B. Voxelization) hinzugefügt.
  • Stufe 3 fügt 1/512-Unsicherheitsregionen hinzu, die interne Eingabeabdeckung und unterstützt okklusions-Culling. Die Eingabeabdeckung fügt den neuen Wert SV_InnerCoverage zur High Level Shading Language (HLSL) hinzu. Dies ist eine 32-Bit-Skalare ganze Zahl, die bei der Eingabe eines Pixelshadrs angegeben werden kann, und stellt die unterschätzten konservativen Rasterungsinformationen dar (d. h., ob ein Pixel garantiert ist -to-be- vollständig abgedeckt).

API-Zusammenfassung

Die folgenden Methoden, Strukturen, Enumerationen und Hilfsklassen verweisen auf konservative Rasterung: