Ich möchte Vollbild-Anti-Aliasing in OpenGL ausführen und möchte nicht das Anti-Aliasing verwenden, das von OpenGL selbst bereitgestellt wird, da ich ein Spiel erstelle und gute Effekte darin haben möchte.
Wie soll ich vorgehen?
opengl
antialiasing
nickte
quelle
quelle
Antworten:
Es gibt verschiedene Alternativen zu nativem MSAA in OpenGL. Das Beste an Post-Processing-Effekten ist, dass Sie normalerweise nur den Shader auf das endgültige, unverarbeitete Bild anwenden können und der Rest erledigt wird. Hier sind drei Methoden, die einen Blick wert sind:
Fast Approximate Anti-Aliasing (Geeks3D) - In den meisten Fällen gut. Ziemlich einfach anzuwenden und zu verstehen. Nachteil ist scharf, kontrastreiches Rauschen in Texturen wird etwas unscharf. Ränder, die so subtil wie 1/4 Pixel steil sind, sehen wie herkömmliche MSAA absolut genau aus. Weniger steil als das, es verliert ein bisschen an Genauigkeit.
Normales gefiltertes Anti-Aliasing (GameDev ) - Habe dieses noch nicht genau getestet, aber es ist am einfachsten zu verstehen. In den besten Fällen ähnelt es 16x MSAA und im schlimmsten Fall 2x MSAA. Es wird eine temporäre Normalkarte zur Darstellung von Kanten und relativen Winkeln erstellt. Sie können die normale Karte entweder mit Luma-Unterschied oder Farbunterschied abtasten.
Morphologisches Anti-Aliasing (Iryoku) - wurde zu SMAA - Subpixel Mophological AA verbessert. Es ist bei 4 Durchläufen ziemlich komplex, erzielt aber die besten Ergebnisse, die ich je gesehen habe. Es werden Farbverläufe entlang von Kanten mit einer Steilheit von 1/100 bis 1/200 Pixel (!) Erstellt. Die Abtastung kann luma-basiert, farbbasiert oder tiefenbasiert sein. Texturen bleiben sehr knackig und sauber. (Das Beispiel basiert auf DX10 und HLSL. Es würde einige Zeit dauern, bis es korrekt auf GLSL portiert ist.)
Bei diesen Techniken werden keine Über- oder Mehrfachabtastungen durchgeführt, sodass Linien mit einer Dicke von weniger als 1 Pixel mit Lücken angezeigt werden und nicht korrekt geglättet werden. Dies ist der Nachteil eines Nicht-MSAA-Ansatzes. Da Sie nur mit einem Rasterbild in voller Auflösung arbeiten, können Sie aus diesen leeren Lücken keine zusätzlichen Informationen erstellen.
Beachten Sie, dass alle diese Techniken von der Abtastung benachbarter Werte für Luma (Helligkeit) oder Chroma (Farbe) abhängen. Für die Berechnung der Luma und der optionalen Gammakorrektur sind zusätzliche Anweisungen für den AA-Shader erforderlich, obwohl dies ziemlich einfach ist. Sie können dies auslagern, indem Sie die Luma im vorherigen Shader berechnen, der das nicht retuschierte Bild liefert, und die Luma im Alphakanal speichern. Dann werden Sie im AA-Shader einfach das Alpha abtasten.
quelle
Es gibt viele Möglichkeiten, Antialiasing durchzuführen. Eine Möglichkeit ist die Verwendung von Multisample-Antialiasing (MSAA), bei dem Ihr Backbuffer tatsächlich mehrere Subpixel-Samples speichert. Wenn Sie Dreiecke, Linien usw. rendern, füllt das System automatisch die richtigen Samples in jedem Pixel aus. Am Ende des Renderns wird das Bild dann durch Mitteln über alle Subpixel-Abtastwerte "aufgelöst", um einen Abtastwert pro Pixel zu erhalten.
Eine andere Möglichkeit ist die Verwendung von Nachbearbeitungs-Antialiasing, bei dem Sie die Szene wie gewohnt rendern und dann gezielte Unschärfen am Endergebnis vornehmen, um verfälschte Kanten auszublenden. Hierfür gibt es eine Vielzahl von Techniken, aber eine der derzeit besten / beliebtesten ist FXAA (Fast Approximate Anti-Aliasing).
MSAA liefert im Allgemeinen besser aussehende Ergebnisse als die Nachbearbeitung von AA, kann jedoch langsamer sein, da für jeden Rendervorgang ungefähr die doppelte Speicherbandbreite erforderlich ist. MSAA kann abhängig von den Details des Setups auch mehr Videospeicher als Nachbearbeitungs-AA erfordern.
Sie können spezifische Informationen zur Implementierung von MSAA oder FXAA im Web finden - googeln Sie einfach einen dieser Begriffe.
quelle
Sind Sie bereit, Ihren eigenen GLSL-Shader zu programmieren? Wenn ja, überprüfen Sie dieses Tutorial.
quelle