(gelöst)[D3D 11] Backface Culling funktioniert nur ohne MSAA

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

(gelöst)[D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

And now for something completely different.

Ich zeichne Modelle mit recht hoher Dreiecksdichte. Und sie flimmern. Sie flimmern wie bescheuert. Hier habe ich einen einfachen Shader geschrieben, der die Vertex-Normale durchreicht, ohne weitere Berechnungen, 2× vergrößert:
4x AA breakdown.png
Beachtet die grünen, gelben, und orangen Pixel, die überall durchflimmern. Das sind Back Faces, die eigentlich unsichtbar sein sollten. In Bewegung sieht das noch schlimmer aus.

Die Artefakte verschwinden unter drei Bedingungen:
  1. Multisampling abschalten.
  2. Back Face Culling aktivieren.
  3. Heranzoomen, so dass die Dreiecke größer werden.
Sieht aus, als ob der Depth Buffer einfach nicht mit Multisampling klarkommt. What the fuck?! Welche Einstellung kann ich da verhauen haben? Wo soll ich überhaupt anfangen, zu suchen?

GPU ist eine GeForce GTX irgendwas. Ich habe das Control Panel gelöscht weil’s mich genervt hat; habe aber vorher nie etwas daran verstellt (gehe also nicht von einem falsch konfigurierten Treiber aus).
Zuletzt geändert von Krishty am 18.11.2016, 10:14, insgesamt 1-mal geändert.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
xq
Establishment
Beiträge: 1581
Registriert: 07.10.2012, 14:56
Alter Benutzername: MasterQ32
Echter Name: Felix Queißner
Wohnort: Stuttgart & Region
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von xq »

Mal GANZ blöd gefragt: Ist dein Depth Buffer multisampled?
War mal MasterQ32, findet den Namen aber mittlerweile ziemlich albern…

Programmiert viel in ⚡️Zig⚡️ und nervt Leute damit.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

Guter Punkt. Count=4 und Quality=0, genau wie der Back Buffer. Die Debug Runtime gibt auch keine Warnungen wegen unpassender Formate aus.

Ich bemühe mich, noch einen anderen Rechner aufzutreiben; das wird aber frühestens morgen abend klappen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
B.G.Michi
Establishment
Beiträge: 163
Registriert: 07.03.2006, 20:38
Alter Benutzername: B.G.Michi
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von B.G.Michi »

Sieht aus wie Rundungsfehler bei der Rasterisierung der Dreiecke wegen nicht exakt gleicher, benachbarter Vertices/Kanten. Damit wäre das ein Problem des Modells und ließe sich beheben indem du sehr nahe beieinander liegende Vertices zusammenfasst.
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

Nein, jedes Vertex ist einzigartig und wird von lückenlosen Dreiecken geteilt. Die Topologie wird sogar mehrfach verifiziert.

Wenn es das wäre, würden die Artefakte auch nicht verschwinden, sobald ich Back Faces ausschalte, sondern durch die Hintergrundfarbe ersetzt werden.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

Ich gebe mal statt den Normalen die Farbe aus, und da sind keine Artefakte drin. Hm.

Nachtrag: Woah, fett. Wenn ich im Rasterizer State das Multisampling abschalte, verschwinden die Artefakte zu >99 %, aber ich habe trotzdem Multisampling. Häh?!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

Okay, ich habe es tatsächlich auf D3D11_RASTERIZER_DESC::MultisampleEnable reduzieren können. Situation:
  • Feature Levels 10.0/10.1/11.0 auf 11er-Hardware, keine Unterschiede
  • Render Target & Depth Stencil Buffer sind multisampled (SAMPLE_DESC == { 4, 0 })
  • MultisampleEnable == TRUE: Artefakte
  • MultisampleEnable == FALSE: okay
Die MSDN zu MultisampleEnable:
MSDN: D3D11_RASTERIZER_DESC hat geschrieben:Enable multisample antialiasing.
Ja, das ist es. Das ist die Dokumentation.

Nun kann ich mir nicht vorstellen, dass das alles sein soll, denn einerseits deckt sich das nicht mit dem Verhalten hier (ich habe auch MSAA, wenn ich es auf FALSE setze, aber das Render Target multisampled ist!) und andererseits war das Flag unter D3D 10 viel komplexer:
MSDN: D3D10_RASTERIZER_DESC hat geschrieben:Specifies whether to use the quadrilateral or alpha line anti-aliasing algorithm on multisample antialiasing (MSAA) render targets. The default value is FALSE. Set to TRUE to use the quadrilateral line anti-aliasing algorithm and to FALSE to use the alpha line anti-aliasing algorithm. For more info about this member, see Remarks.
MSDN: Remarks dazu hat geschrieben:Note For feature levels 9.1, 9.2, 9.3, and 10.0, if you set MultisampleEnable to FALSE, the runtime renders all points, lines, and triangles without anti-aliasing even for render targets with a sample count greater than 1. For feature level 10.1, the setting of MultisampleEnable has no effect on points and triangles with regard to MSAA and impacts only the selection of the line-rendering algorithm […]
The settings of the MultisampleEnable and AntialiasedLineEnable members apply only to multisample antialiasing (MSAA) render targets (that is, render targets with sample counts greater than 1). Because of the differences in feature-level behavior and as long as you aren’t performing any line drawing or don’t mind that lines render as quadrilaterals, we recommend that you always set MultisampleEnable to TRUE whenever you render on MSAA render targets.
Aus diesem Grund war es bei mir TRUE (verschiedene Feature Levels und ich zeichne keine Lines), aber DANN WERDEN MEINE DREIECKE FALSCH RASTERISIERT. Und 11 scheint das 10.1-Verhalten fortzusetzen – 10.0, 10.1, und 11.0 erzeugen alle den selben Dreck, sobald MultisampleEnable == TRUE, machen MSAA an/aus aber ausschließlich am Render Target fest.

Nachtrag: Die Beschreibung von D3D11_1_DDI_RASTERIZER_DESC könnte auch zum Verständnis helfen, gilt aber für 11.1 (ich bin auf 11.0) und ist Treiber-intern:
A Boolean value that specifies whether the driver must follow multiple-sampled rasterization rules. TRUE indicates to follow the rules; FALSE indicates following the rules is not required. Multiple-sampled rasterization rules hold true even if render targets contain only a single sample.
Welche Regeln sollen das sein? Verhindert das Treiber-interne Optimierungen bei MSAA?

Bitte erklärt mir, was da falsch läuft!
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
gdsWizard
Establishment
Beiträge: 237
Registriert: 04.02.2005, 09:12
Benutzertext: www.gamedevstudio.com
Echter Name: Thomas Mittelsdorf
Wohnort: Meiningen
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von gdsWizard »

Hast Du mal geschaut ob die Dreiecke doppelt aber mit umgekehrten Normalen vorhanden sind ? Ich glaube das war mir mal bei meinem 3ds-Loader aufgefallen, also das Dreiecke mit selben oder ähnlichen Vertices eine 2.Geometry bilden. Zumindest sieht es für mich so aus.

Edit: Habe gerade das ganze nochmal überflogen und gesehen das du sie schon als Backfaces identifiziert hast. Sorry.
Benutzeravatar
dot
Establishment
Beiträge: 1734
Registriert: 06.03.2004, 18:10
Echter Name: Michael Kenzel
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von dot »

Hast du's schonmal auf AMD laufen lassen? Wär nur interessant ob sich da ein Unterschied zeigt...
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

Habe frühestens DO Zugriff auf eine AMD-Karte :(
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Krishty
Establishment
Beiträge: 8229
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: [D3D 11] Backface Culling funktioniert nur ohne MSAA

Beitrag von Krishty »

Auf der AMD-Karte spielt die Einstellung keine Rolle; beide Versionen sehen butterweich korrekt aus. Also hat der Nvidia-Treiber verkackt. Na wie prächtig.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten