Gammasteuerelemente (Direct3D 9)

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

Gammasteuerelemente sind eine Eigenschaft einer Austauschkette. Gammasteuerelemente ermöglichen es, dynamisch zu ändern, wie die roten, grünen und blauen Ebenen einer Oberfläche den tatsächlichen Ebenen des Systems zuordnen. Durch Festlegen von Gammapegeln können Sie bewirken, dass der Bildschirm des Benutzers farbenb blinkt – rot, wenn das Zeichen des Benutzers gedreht wird, grün, wenn das Zeichen ein neues Element einwählt, und so weiter – ohne neue Bilder in den Framepuffer zu kopieren, um den Effekt zu erzielen. Oder Sie können die Farbebenen anpassen, um eine Farbverzerrung auf die Bilder im Hintergrundpuffer anzuwenden.

Es gibt immer mindestens eine Swapkette (die implizite Austauschkette) für jedes Gerät, da Direct3D 9 über eine Swapkette als Eigenschaft des Geräts verfügt. Da die Gamma-Rampe eine Eigenschaft der Austauschkette ist, kann die Gamma-Rampe angewendet werden, wenn die Austauschkette über ein Fenster angezeigt wird. Die Gamma-Rampe wird sofort wirksam. Es wird nicht auf einen vertikalen Synchronisierungsvorgang gewartet.

Mit den Methoden SetGammaRamp und GetGammaRamp können Sie Rampenebenen 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-Analog-Konverter (DAC) gesendet werden.

Gamma-Rampenstufen

In Direct3D beschreibt der Begriff Gamma-Rampe einen Satz von Werten, die die Ebene einer bestimmten Farbkomponente ( Rot, Grün, Blau) für alle Pixel im Framepuffer neuen Ebenen zuordnen, die von der DAC zur Anzeige empfangen werden. Die Neuveranschaulichung erfolgt über drei Nachschautabellen, eine für jede Farbkomponente.

So funktioniert es: Direct3D verwendet ein Pixel aus dem Framepuffer und wertet die einzelnen Rot-, Grün- und Blau-Farbkomponenten aus. Jede Komponente wird durch einen Wert von 0 bis 65535 dargestellt. Direct3D verwendet den ursprünglichen Wert, um ein Array mit 256 Element (die Rampe) zu indizieren, wobei jedes Element einen Wert enthält, der das ursprüngliche ersetzt. Direct3D führt diesen Look-up- und Replace-Prozess für jede Farbkomponente jedes Pixels im Framepuffer aus und ändert dadurch die endgültigen Farben für alle Pixel auf dem Bildschirm.

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

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 sie die Eingabewerte nicht ändert, bevor sie angezeigt werden. Das rechte Diagramm bietet mehr Variationen. Ihre Rampe enthält Werte zwischen 0 im ersten Element und 32768 im letzten Element, und werte liegen gleichmäßig dazwischen. Der Effekt ist, dass die Farbkomponente, die diese Rampe verwendet, auf der Anzeige stumm geschaltet angezeigt wird. Sie sind nicht auf die Verwendung von linearen Diagrammen 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-Rampenebenen

Gamma-Rampenebenen sind effektiv Nachschautabellen, die Direct3D verwendet, um die Komponenten der Framepufferfarbe neuen Ebenen zu zuordnen, 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 D3ZERTIFIKATR _ CALIBRATION oder D3ZERTIFIKATR 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 Gamma-Rampen enthält. GetGammaRamp verfügt über einen Parameter, der einen Zeiger auf einen D3DGAMMARAMP-Typ verwendet, der mit der aktuellen Gamma-Rampe gefüllt wird.

Sie können den D3ATORSR-WERT FÜR DIE KALIBRIERUNG für den ersten Parameter von SetGammaRamp angeben, um den Kalibrierungsparameter beim Festlegen neuer _ Gammawerte aufrufen. Die Kalibrierung von Gamma-Rampen verursacht verarbeitungsaufwand und sollte nicht häufig verwendet werden. Das Festlegen einer kalibrierten Gamma-Rampe bietet dem Benutzer unabhängig vom Adapter und Monitor einen konsistenten und absoluten Gammawert.

Nicht alle Systeme unterstützen die Gamma-Kalibrierung. Um zu ermitteln, ob gamma-Kalibrierung unterstützt wird, rufen Sie GetDeviceCapsauf, und untersuchen Sie das Caps2-Member der zugeordneten D3DCAPS9-Struktur, nachdem die Methode zurückgegeben wurde. Wenn das D3DCAPS2 _ CANCALIBRATEGAMMA-Funktionsflag vorhanden ist, wird die Gamma-Kalibrierung 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 vollbildbasierten exklusiven Modus befindet. Wenn sich Ihre Anwendung in den normalen Modus ändert, werden die Rampenebenen zurückgelegt und wieder wirksam, wenn die Anwendung den Vollbildmodus wieder aktiviert.

Wenn das Gerät keine Gamma-Rampen im aktuellen Präsentationsmodus der Austauschkette (Vollbild oder Fenster) unterstützt, wird kein Fehlerwert zurückgegeben. Anwendungen können die Funktionsbits D3DCAPS2 _ FULLSCREENGAMMA und D3DCAPS2 _ CANCALIBRATEGAMMA im Caps2-Member des D3DCAPS9-Typs überprüfen, um die Funktionen des Geräts zu bestimmen und zu ermitteln, ob ein Kalibrierer installiert ist.

Direct3D-Oberflächen