Gammasteuerelemente (Direct3D 9)
Gammasteuerelemente ermöglichen es Ihnen, zu ändern, wie das System den Inhalt der Oberfläche anzeigt, ohne dass sich dies auf den Inhalt der Oberfläche selbst auswirkt. Stellen Sie sich diese Steuerelemente als sehr einfache Filter vor, die Direct3D auf Daten anwendet, während sie eine Oberfläche verlässt und bevor sie auf dem Bildschirm gerendert wird.
Gammasteuerelemente sind eine Eigenschaft einer Swapchain. Gammasteuerelemente ermöglichen es, dynamisch zu ändern, wie die roten, grünen und blauen Ebenen einer Oberfläche den tatsächlichen Ebenen zugeordnet werden, die das System anzeigt. Durch festlegen von Gammastufen können Sie dazu führen, dass der Bildschirm des Benutzers farben blinkt – rot, wenn das Zeichen des Benutzers geschossen wird, grün, wenn das Zeichen ein neues Element einnimmt usw. – ohne neue Bilder in den Framepuffer zu kopieren, um den Effekt zu erzielen. Oder Sie können Farbstufen anpassen, um eine Farbabweichung auf die Bilder im Hintergrundpuffer anzuwenden.
Es gibt immer mindestens eine Swapchain (die implizite Swapchain) für jedes Gerät, da Direct3D 9 über eine Swapchain als Eigenschaft des Geräts verfügt. Da die Gammahierarchie eine Eigenschaft der Swapchain ist, kann die Gammahierarchie angewendet werden, wenn die Swapchain fensteriert wird. Die Gammahierarchie wird sofort wirksam. Es ist nicht auf einen vertikalen Synchronisierungsvorgang zu warten.
Mit den SetGammaRamp- und GetGammaRamp- Methoden 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-zu-analogen Konverter (DAC) gesendet werden.
Gammahierarchiestufen
In Direct3D beschreibt der Begriff Gammahierarchie einen Satz von Werten, die die Ebene einer bestimmten Farbkomponente (Rot, Grün, Blau) für alle Pixel im Framepuffer auf neue Ebenen zuordnen, die vom DAC für die Anzeige empfangen werden. Die Neuzuordnung erfolgt über drei Nachschlagetabellen, eine für jede Farbkomponente.
So funktioniert's: Direct3D übernimmt 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 256-Elementarrays (der 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 Diagramme zu visualisieren, wie in den folgenden beiden Diagrammen dargestellt. Das linke Diagramm zeigt eine Rampe, die überhaupt keine Farben ändert. Das rechte Diagramm zeigt eine Rampe, die eine negative Verzerrung der Farbkomponente aufgibt, auf die sie angewendet wird.
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 vor der Anzeige ändert. Das rechte Diagramm bietet mehr Variation; Seine Rampe enthält Werte, die zwischen 0 im ersten Element und 32768 im letzten Element liegen, wobei werte einheitlich dazwischen liegen. Der Effekt ist, dass die Farbkomponente, die diese Rampe verwendet, auf der Anzeige stumm geschaltet wird. Sie sind nicht darauf beschränkt, lineare Diagramme zu verwenden; wenn Ihre Anwendung bei Bedarf beliebige Zuordnungen zuweisen kann. Sie können sogar die Einträge auf alle Nullen festlegen, um eine Farbkomponente vollständig aus der Anzeige zu entfernen.
Festlegen und Abrufen von Gammahierarchieebenen
Gammahierarchieebenen sind effektive Nachschlagetabellen, die Direct3D zum Zuordnen der Framepufferfarbkomponenten zu neuen Ebenen verwendet, die angezeigt werden. Sie können Rampenstufen 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 akzeptiert. 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-Elementarrays von WORDs, jeweils ein Array, das die roten, grünen und blauen Gammahierarchien enthält. GetGammaRamp hat einen Parameter, der einen Zeiger auf einen D3DGAMMARAMP Typ annimmt, der mit der aktuellen Gammahierarchie gefüllt wird.
Sie können den D3DSGR_CALIBRATE Wert für den ersten Parameter von SetGammaRamp- einschließen, um den Kalibrieror aufzurufen, wenn neue Gammaebenen festgelegt werden. Die Kalibrierung von Gammahierarchien verursacht einen gewissen Verarbeitungsaufwand und sollte nicht häufig verwendet werden. Das Festlegen einer kalibrierten Gammahierarchie stellt unabhängig vom Displayadapter und Monitor einen konsistenten und absoluten Gammawert für den Benutzer bereit.
Nicht alle Systeme unterstützen die Gammakalibrierung. Um festzustellen, ob die Gammakalibrierung unterstützt wird, rufen Sie GetDeviceCapsauf, und überprüfen Sie das Caps2-Element der zugeordneten D3DCAPS9-Struktur, nachdem die Methode zurückgegeben wurde. Wenn das D3DCAPS2_CANCALIBRATEGAMMA-Funktionsflaggen vorhanden ist, wird die Gammakalibrierung unterstützt.
Beachten Sie beim Festlegen neuer Rampenebenen, dass die in den Arrays festgelegten Ebenen nur verwendet werden, wenn sich Ihre Anwendung im Vollbildmodus und im exklusiven Modus befindet. Wenn ihre Anwendung in den normalen Modus wechselt, werden die Rampenebenen beiseite gelegt und wieder wirksam, wenn die Anwendung den Vollbildmodus wieder einrichtet.
Wenn das Gerät Gammahierarchien 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-Element des D3DCAPS9 Typs überprüfen, um die Funktionen des Geräts zu ermitteln und ob ein Kalibrieror installiert ist.
Verwandte Themen