Das ist eine Frage, die leider noch niemand wirklich eindeutig, verbindlich und mit einer perfekten Lösung beantworten konnte. Weiterhin ist das schon sicher fortgeschrittener, als Kapitel 2.
Es gibt verschiedene Methoden. Darunter Depth-Peeling. Aber diese sind äußerst Performance-hungrig und sind nahezu unbrauchbar im Echtzeitrendering.
Ausschließlich auf der GPU und mit nur einem Pass lässt sich sowas sehr schwer (wenn überhaupt) realisieren.
Eine Möglichkeit wäre es, für statische Objekte einen BSP oder AABB-Tree vorzugenerieren und anhand diesem, die Polygone einzeln (oder in minimalen Gruppen) zu rendern, wenn man sie vorher entsprechend der Kameraorientierung ausrichtet. Nachteil dieser Methode ist, dass sie sehr viele einzelne DrawCalls umfasst und die Leistung der GPU nahezu überhaupt nicht ausnutzt. Weiterhin funktioniert das nur für statische Objekte performant. Bei dynamischen müsste man dauerhaft den Tree modifizieren bzw. neu Berechnen.
Eine weitere Möglichkeit ist, mithilfe eines (oder ggf. mehrerer) Screenspace passes, die Polygone in mehrere (MRTs) Depth-Buffers ("Layer") zu sortieren. Anschließend kann man mithilfe dieser MRTs die Polygone sortiert rendern. Vorteil davon ist, dass es die GPU-Rechenleistung nutzt und keine Vorberechnung benötigt. Somit sind auch dynamische Objekte möglich.
Letztendlich sollte man sich aber die Frage stellen, ob das alle notwendig ist und in welchen Fällen solche Semi-Transparenten Objekte mit konkaver Form vorkommen. Fensterscheiben sind flach. Eine Wasseroberfläche ist konvex. Eine gläserne Teekanne oder ein transparenter Donut ist mir bis jetzt in Spielen noch nicht über den Weg gelaufen