Freigeben über


Gammasteuerung (Direct3D 9)

Mit Gamma-Steuerelementen können Sie ändern, wie das System den Inhalt der Oberfläche anzeigt, ohne sich auf den Inhalt der Oberfläche selbst zu auswirken. Stellen Sie sich diese Steuerelemente als sehr einfache Filter vor, die Direct3D auf Daten anwendet, wenn sie eine Oberfläche verlassen und bevor sie auf dem Bildschirm gerendert werden.

Gammasteuerelemente sind eine Eigenschaft einer Swapchain. Gamma-Steuerelemente ermöglichen es, dynamisch zu ändern, wie die Rot-, Grün- und Blaustufen einer Oberfläche den tatsächlichen Ebenen entsprechen, die das System anzeigt. Durch Festlegen von Gammawerten können Sie bewirken, dass der Bildschirm des Benutzers Farben blinkt – rot, wenn das Zeichen des Benutzers geschossen wird, grün, wenn das Zeichen ein neues Element aufnimmt usw. - ohne neue Bilder in den Framepuffer zu kopieren, um den Effekt zu erzielen. Alternativ können Sie die Farbstufen anpassen, um eine Farbverzerrung auf die Bilder im Backpuffer anzuwenden.

Es gibt immer mindestens eine Swap chain (die implizite Swap chain) für jedes Gerät, da Direct3D 9 über eine Swapchain als Eigenschaft des Geräts verfügt. Da die Gammarampe eine Eigenschaft der Swap chain ist, kann die Gammarampe angewendet werden, wenn die Swapchain fenstert wird. Die Gammarampe wird sofort wirksam. Es gibt kein Warten auf einen vertikalen Synchronisierungsvorgang.

Mit den Methoden SetGammaRamp und GetGammaRamp können Sie Rampenstufen bearbeiten, die sich auf die roten, grünen und blauen Farbkomponenten von Pixeln von der Oberfläche auswirken, bevor sie zur Anzeige an den digital-analogen Konverter (DAC) gesendet werden.

Gamma-Rampenstufen

In Direct3D beschreibt der Begriff Gammarampe eine Reihe von Werten, die die Ebene einer bestimmten Farbkomponente ( rot, grün, blau) für alle Pixel im Framepuffer auf neue Ebenen zuordnen, die von der DAC zur Anzeige empfangen werden. Die Neuzuordnung erfolgt über drei Nachschlagetabellen, eine für jede Farbkomponente.

So funktioniert es: Direct3D nimmt ein Pixel aus dem Framepuffer und wertet die einzelnen roten, grünen und blauen Farbkomponenten aus. Jede Komponente wird durch einen Wert von 0 bis 65535 dargestellt. Direct3D verwendet den ursprünglichen Wert und verwendet ihn zum Indizieren eines Arrays mit 256 Elementen (Rampe), wobei jedes Element einen Wert enthält, der das ursprüngliche Element ersetzt. Direct3D führt diesen Nachschlage- und Ersetzungsprozess für jede Farbkomponente jedes Pixels im Framepuffer durch, wodurch die endgültigen Farben für alle Bildschirmpixel geändert werden.

Es ist praktisch, die Rampenwerte durch Graphen zu visualisieren, wie in den folgenden beiden Diagrammen gezeigt. Das linke Diagramm zeigt eine Rampe, die die Farben überhaupt nicht ändert. Das rechte Diagramm zeigt eine Rampe, die der Farbkomponente, auf die sie angewendet wird, eine negative Verzerrung auferlegt.

Diagramme der Gamma-Rampenwerte

Die Arrayelemente für das Diagramm auf der linken Seite enthalten Werte, die mit ihrem Index identisch sind: 0 im Element bei Index 0 und 65535 bei Index 255. Diese Art von Rampe ist die Standardeinstellung, da die Eingabewerte nicht geändert werden, bevor sie angezeigt werden. Das richtige Diagramm bietet mehr Variation; seine Rampe enthält Werte, die zwischen 0 im ersten Element und 32768 im letzten Element liegen. Der Effekt ist, dass die Farbkomponente, die diese Rampe verwendet, auf dem Display stumm angezeigt wird. Sie sind nicht auf die Verwendung linearer Diagramme beschränkt. , wenn Ihre Anwendung bei Bedarf beliebige Zuordnungen zuweisen kann. Sie können die Einträge sogar auf alle Nullen festlegen, um eine Farbkomponente vollständig aus der Anzeige zu entfernen.

Festlegen und Abrufen von Gamma-Rampenstufen

Gamma-Rampenstufen sind effektiv Nachschlagetabellen, die Direct3D verwendet, um die Farbkomponenten des Framepuffers neuen Ebenen zuzuordnen, die angezeigt werden. Sie können Rampenebenen für die primäre Oberfläche festlegen und abrufen, indem Sie die Methoden SetGammaRamp und GetGammaRamp aufrufen. SetGammaRamp akzeptiert zwei Parameter und GetGammaRamp einen Parameter. Für SetGammaRamp ist der erste Parameter entweder D3DSGR_CALIBRATE oder D3DSGR_NO_CALIBRATION. Der zweite Parameter, pRamp, ist ein Zeiger auf eine D3DGAMMARAMP-Struktur . Die D3DGAMMARAMP-Struktur enthält drei 256-Element-Arrays von WORDs, jeweils ein Array, das die roten, grünen und blauen Gammarampen enthält. GetGammaRamp verfügt über einen Parameter, der einen Zeiger auf einen D3DGAMMARAMP-Typ annimmt, der mit der aktuellen Gammarampe gefüllt wird.

Sie können den D3DSGR_CALIBRATE-Wert für den ersten Parameter von SetGammaRamp einschließen, um den Kalibrator beim Festlegen neuer Gammawerte aufzurufen. Das Kalibrieren von Gammarampen verursacht einen gewissen Verarbeitungsaufwand und sollte nicht häufig verwendet werden. Das Festlegen einer kalibrierten Gammarampe bietet einen konsistenten und absoluten Gammawert für den Benutzer, unabhängig von Anzeigeadapter und Monitor.

Nicht alle Systeme unterstützen die Gammakalibrierung. Um zu ermitteln, ob die Gammakalibrierung unterstützt wird, rufen Sie GetDeviceCaps auf, und untersuchen Sie das Caps2-Element der zugeordneten D3DCAPS9-Struktur , nachdem die Methode zurückgegeben wurde. Wenn das D3DCAPS2_CANCALIBRATEGAMMA-Funktionsflag vorhanden ist, wird die Gammakalibrierung unterstützt.

Beachten Sie beim Festlegen neuer Rampenebenen, dass die Ebenen, die Sie in den Arrays festlegen, nur verwendet werden, wenn sich Ihre Anwendung im exklusiven Vollbildmodus befindet. Immer wenn Ihre Anwendung in den normalen Modus wechselt, werden die Rampenstufen aufgehoben und werden wieder wirksam, wenn die Anwendung den Vollbildmodus wieder einrichtet.

Wenn das Gerät gamma-Ramps im aktuellen Präsentationsmodus der Swapchain (Vollbild oder Fenster) nicht unterstützt, wird kein Fehlerwert zurückgegeben. Anwendungen können die D3DCAPS2_FULLSCREENGAMMA- und D3DCAPS2_CANCALIBRATEGAMMA-Funktionsbits im Caps2-Member des D3DCAPS9-Typs überprüfen, um die Funktionen des Geräts zu ermitteln und zu ermitteln, ob ein Kalibrators installiert ist.

Direct3D-Oberflächen