Direct3D 11.3 Konservative Rasterung

Die konservative Rasterung verleiht dem Pixelrendering eine gewisse Sicherheit, was insbesondere für Algorithmen zur Kollisionserkennung hilfreich ist.

Übersicht

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

Die konservative Rasterung ist in einer Reihe von Situationen nützlich, einschließlich der Sicherheit bei der Kollisionserkennung, der Verdeckungskulierung und der Sichtbarkeitserkennung.

Die folgende Abbildung zeigt beispielsweise 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 "oben-links-Regel" gerendert werden, die ins Spiel kommt, wenn der Rand des Dreiecks den Rand der Pixel kreuzt. Es können falsch positive Werte (Pixel festgelegt sein, die nicht vorhanden sein sollten), die das System normalerweise, aber nicht immer ull.

zeigt die oben linke Regel an

Interaktionen mit der Pipeline

Viele Details zur Interaktion der konservativen Rasterung mit der Grafikpipeline finden Sie unter D3D12 Konservative Rasterung.

Details zur Implementierung

Der in Direct3D 12 unterstützte Rasterungstyp 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 Primitiven abgedeckt sind, gerastert werden. Unterschätzte konservative Rasterungsinformationen sind über den Pixel-Shader durch die Verwendung von Eingabeabdeckungsdaten verfügbar, und nur eine überschätzte konservative Rasterung ist als Rasterungsmodus verfügbar.

Wenn ein Teil eines Primitiven 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 linken Regel" implementierungsspezifisch. Für Implementierungen, die degenerate Dreiecke unterstützen, muss ein entartetes Dreieck entlang einer Kante oder Ecke jedoch mindestens ein Pixel abdecken.

Konservative Rasterungsimplementierungen können auf unterschiedlicher Hardware variieren und falsche positive Ergebnisse erzeugen, was bedeutet, dass sie fälschlicherweise entscheiden können, dass Pixel abgedeckt werden. Dies kann aufgrund von implementierungsspezifischen Details wie primitiven Wachstums- oder Snappingfehlern auftreten, die den bei der Rasterung verwendeten Fixpunktvertexkoordinaten inhärent sind. Der Grund, warum falsch positive Werte (in Bezug auf Fixpunktvertexkoordinaten) gültig sind, liegt darin, dass eine gewisse Menge falsch positiver Werte erforderlich ist, um eine Implementierung die Erfassungsbewertung für nach dem Schnappen vorgenommene Scheitelpunkte (d. h. Vertexkoordinaten, die vom Gleitkommapunkt in den im Rasterisierer verwendeten Fixpunkt 16,8 konvertiert wurden) zu ermöglichen, aber die Abdeckung berücksichtigen, die von den ursprünglichen Gleitkommavertexkoordinaten erzeugt wurde.

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

Dreiecke, die degeneriert sind (doppelte Indizes in einem Indexpuffer oder kollinear in 3D) oder nach der Fixpunktkonvertierung degenerieren (kollineare Scheitelpunkte im Rasterisierer), können oder nicht gekullt werden; Beides sind gültige Verhaltensweisen. Entartete Dreiecke müssen als nach hinten gerichtet betrachtet werden. Wenn also ein bestimmtes Verhalten für eine Anwendung erforderlich ist, kann sie rückseitige Kulling- oder Tests für frontseitige Verkleidungen verwenden. Entartete Dreiecke verwenden die Werte, die Vertex 0 für alle interpolierten Werte zugewiesen sind.

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

  • Ebene 1 unterstützt 1/2 Pixelunsicherheitsregionen, und nach dem Snap wird keine Degenerierung angezeigt. Dies eignet sich gut für gekacheltes Rendering, einen Texturatlas, die Generierung von Lichtkarten und Schattenkarten unter Pixeln.
  • Ebene 2 fügt Degenerate nach dem Snap und 1/256 Unsicherheitsregionen hinzu. Außerdem wird unterstützung für CPU-basierte Algorithmusbeschleunigung (z. B. Voxelisierung) hinzugefügt.
  • Ebene 3 fügt 1/512-Unsicherheitsregionen hinzu und unterstützt die Verdeckungskulierung. Die Eingabeabdeckung fügt den neuen Wert SV_InnerCoverage zur High Level Shading Language (HLSL) hinzu. Hierbei handelt es sich um eine skalare 32-Bit-Ganzzahl, die bei der Eingabe in einen Pixel-Shader angegeben werden kann und die unterschätzten Informationen zur konservativen Rasterung darstellt (d. a. ob ein Pixel garantiert vollständig abgedeckt wird).

API-Zusammenfassung

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