Aufgeschobene Abziehbilder normales Problem

11

Ich habe an einem verzögerten Abziehbildsystem gearbeitet. Bisher habe ich den Projektionsteil fertiggestellt, was bedeutet, dass ich auf etwas in der Szene klicken kann und ein Abziehbild ordnungsgemäß auf die Oberfläche des Objekts projiziert wird.

Es gibt noch ein paar andere Dinge, die ich diesem System hinzufügen möchte: normales Abschneiden und normale zugeordnete Abziehbilder. Normales Abschneiden ist, wenn ich Fragmente verwerfe, die über einen scharfen Winkel gespannt sind. Gesehen hier . Eine Möglichkeit, dies zu lösen, besteht darin, Fragmente zu verwerfen, die einen großen Unterschied zwischen der Normalen im G-Puffer und der Normalen des Abziehbilds aufweisen. Dies würde das Lesen der normalen Textur des G-Puffers erfordern.

Um eine normale Abbildung des Abziehbilds durchzuführen, muss ich die Normalen des Abziehbilds (von einer normalen Zuordnung) mit der Normalen des G-Puffers mischen. Dies erfordert das Schreiben in die normale Textur des G-Puffers.

Ich hoffe, es ist klar, dass ich zur Unterstützung dieser beiden Funktionen im selben Shader-Durchgang die normale Textur lesen und schreiben muss. Leider ist dies ein undefiniertes Verhalten, daher frage ich mich, ob es eine andere Möglichkeit gibt, diese Funktionen zu implementieren.

Ian
quelle

Antworten:

1

Welches Rendering-System verwenden Sie? Die folgenden Informationen sollten für alle Rendering-Systeme gültig sein, aber in OpenGL-Versionen mit DX11 oder höher gibt es möglicherweise eine bessere Lösung mit UAVs.

- -

Sie müssen den normalen Puffer vor jedem Durchgang kopieren. Solange Sie wissen, dass die Abziehbilder nicht dieselben Fragmente des Bildschirmbereichs ändern, müssen Sie die Kopie nicht aktualisieren.

Sie können auch alle Ihre Abziehbilder in separate Puffer rendern und nur einen Mischungsdurchlauf mit einer einzigen normalen Pufferkopie in Ihren normalen Puffer ausführen. Dies würde mit der Anzahl der Abziehbilder, die Sie haben, viel besser skalieren.

Solange Sie den normalen Puffer nicht schreiben, z. B. nur normales Clipping durchführen, wie Sie es nennen, können Sie nur den ursprünglichen normalen Puffer abtasten, ihn jedoch möglicherweise nicht als Renderziel binden.

In DX9 habe ich festgestellt, dass das Lesen und Schreiben mit derselben Textur zu der erwarteten Ausgabe führt, solange Sie nur die Filterung des nächsten Punkts verwenden und niemals ein anderes Pixel lesen als das, auf das Sie gerade schreiben, ABER! Da dies ein undefiniertes Verhalten ist, gibt es möglicherweise Treiber und Grafikkarten, die sich nicht so verhalten. DX10 verhindert dies, indem es Texturen aufhebt, die derzeit als Renderziele gebunden sind.

Archy
quelle