3D-Audio ist eine sehr CPU-lastige Anwendung, die nur zu empfehlen
ist, wenn die Soundkarte Hardware-Mixing unterstützt oder keine weiteren
aufwändigen Berechnungen in der CPU durchgeführt werden müssen. DirectXAudio
unterstützt nur die Ausgabe von 3D-Audio über zwei Lautsprecher. Um mit diesen
Mitteln einen 3-dimensionalen Klangeindruck zu simulieren, werden verschiedene
akustische Phänomene verwendet:
Lautstärke |
Je weiter sich ein Ton vom Ohr entfernt, desto
leiser wird er wahrgenommen. Dieser Zusammenhang wird als Roll-Off-Faktor
bezeichnet. |
Intensitätsunterschiede |
Ein Sound von Rechts ist im rechten Ohr lauter
als im linken Ohr |
Laufzeitunterschiede („Interaurale
Zeitdifferenz“) |
Ein Sound von Rechts kommt im rechten Ohr
ungefähr 1 ms früher an als im linken Ohr |
Dämpfen der Schalls (insbes. der hohen Frequenzen) |
Ein Ton von hinten klingt durch das nach vorne
geöffnete Ohr gedämpfter als von vorne. Ein Ton von hinten rechts wird für
das linke Ohr zusätzlich noch durch den Kopf gedämpft. |
Dopplereffekt |
Erhöhen oder Erniedrigen der Frequenz bei einer
sich bewegenden Geräuschquelle |
Am genauesten ist eine
solche 3D-Umsetzung mit einer head-related transfer function („HRTF“), die den
menschlichen Hörapparat sehr genau nachmodelliert. Dieser sehr rechenintensive
Algorithmus ist in DirectX allerdings aus Performancegründen nur sehr
rudimentär implementiert. Einige Soundkartenhersteller bieten allerdings
bereits eine Hardwarebeschleunigung an.
Der 3D-Sound unter
DirectXAudio klingt insgesamt nicht sehr überzeugend und weit entfernt von
einem 3D-Multikanal-System mit mindestens 4 Lautsprechern.
Soundquellen können in DirectX im Raum mittels eines
3DSoundBuffers über die einfache Funktion SetPosition(x,y,z) in einem
karthesischen Koordinatensystem platziert werden. Die Soundquelle kann dann im
Raum mittels SetVelocity(x,y,z) als Beschleunigung relativ zum Nullpunkt des
Koordinatensystems oder des Zuhörers verschoben werden.
Jede Soundquelle kann
entweder einen Schalltrichter haben oder in alle Richtungen ausstrahlen.
Grafik: MS DirectX8.1 SDK: Schalltrichter
Mittels SetMaxDistance
bzw. SetMinDistance ist es zudem möglich, dass eine Soundquelle ab einer
bestimmten Distanz nicht noch leiser bzw. noch lauter wird. Durch die Angabe
dieser Distanz wird zum einen später benötigte Rechenzeit eingespart, außerdem
gibt es keine Übersteuerungen durch zu dicht am Hörer liegende Signalquellen.
Quelle: MS DirectX SDK 8.1: Minimum and
Maximum Distances
Der Zuhörer wird genau wie die Soundquelle als ein sich
evtl. bewegendes Objekt (ein sog. Listener-Object) im Raum platziert mit
SetPosition(x,y,z,) und SetVelocity(x,y,z).
Das Listener-Object hat
zudem folgende Eigenschaften:
-
Dopplereffekt: gibt an wie stark sich der Dopplereffekt auswirken soll
(relativ zum realen Dopplereffekt)
-
Roll-Off-Factor: Abschwächung des Geräuschpegels in Abhängigkeit von der
Entfernung zum Hörer
-
Orientierung: Orientierung des Kopfes mittels eines Top-Vektors und eines
Front-Vektors. In der nachstehenden Grafik zeigt der Top-Vektor nach oben. Er
ermöglicht das Kippen des Kopfes. Der Front-Vektor zeigt in die Richtung, in
die die Nasenspitze des Hörers zeigt.
Quelle: Sauer,Technik der Spieleprogrammierung