Controles Gamma (Direct3D 9)
Los controles Gamma permiten cambiar la forma en que el sistema muestra el contenido de la superficie, sin afectar al contenido de la propia superficie. Piense en estos controles como filtros muy simples que Direct3D aplica a los datos a medida que sale de una superficie y antes de que se represente en la pantalla.
Los controles Gamma son una propiedad de una cadena de intercambio. Los controles Gamma permiten cambiar dinámicamente cómo se asignan los niveles rojo, verde y azul de una superficie a los niveles reales que muestra el sistema. Al establecer niveles gamma, puedes hacer que la pantalla del usuario parpadee, rojo cuando el carácter del usuario se dispara, verde cuando el carácter recoge un nuevo elemento, etc., sin copiar nuevas imágenes en el búfer de fotogramas para lograr el efecto. O bien, puede ajustar los niveles de color para aplicar un sesgo de color a las imágenes del búfer de reserva.
Siempre hay al menos una cadena de intercambio (la cadena de intercambio implícita) para cada dispositivo porque Direct3D 9 tiene una cadena de intercambio como propiedad del dispositivo. Dado que la rampa gamma es una propiedad de la cadena de intercambio, la rampa gamma se puede aplicar cuando se ventana la cadena de intercambio. La rampa gamma surte efecto inmediatamente. No hay ninguna espera para una operación de sincronización vertical.
Los métodos SetGammaRamp y GetGammaRamp permiten manipular los niveles de rampa que afectan a los componentes de color rojo, verde y azul de píxeles de la superficie antes de enviarlos al convertidor digital a analógico (DAC) para su visualización.
Niveles de rampa gamma
En Direct3D, el término rampa gamma describe un conjunto de valores que asignan el nivel de un componente de color determinado (rojo, verde, azul) para todos los píxeles del búfer de fotogramas a nuevos niveles recibidos por la DAC para mostrar. La reasignación se realiza mediante tres tablas de búsqueda, una para cada componente de color.
Así es como funciona: Direct3D toma un píxel del búfer de fotogramas y evalúa sus componentes de color rojo, verde y azul individuales. Cada componente se representa mediante un valor comprendido entre 0 y 65535. Direct3D toma el valor original y lo usa para indexar una matriz de 256 elementos (la rampa), donde cada elemento contiene un valor que reemplaza al original. Direct3D realiza este proceso de búsqueda y reemplazo para cada componente de color de cada píxel del búfer de fotogramas, cambiando así los colores finales de todos los píxeles en pantalla.
Es útil visualizar los valores de rampa grafoándolos, como se muestra en los dos gráficos siguientes. En el gráfico izquierdo se muestra una rampa que no modifica los colores en absoluto. El gráfico derecho muestra una rampa que impone un sesgo negativo al componente de color al que se aplica.
Los elementos de matriz del gráfico de la izquierda contienen valores idénticos a su índice: 0 en el elemento en el índice 0 y 65535 en el índice 255. Este tipo de rampa es el valor predeterminado, ya que no cambia los valores de entrada antes de que se muestren. El gráfico derecho proporciona más variación; su rampa contiene valores que van de 0 en el primer elemento a 32768 en el último elemento, con valores que van uniformemente entre sí. El efecto es que el componente de color que usa esta rampa aparece silenciado en la pantalla. No se limita al uso de gráficos lineales; si la aplicación puede asignar asignaciones arbitrarias si es necesario. Incluso puede establecer las entradas en todos los ceros para quitar completamente un componente de color de la pantalla.
Establecer y recuperar niveles de rampa gamma
Los niveles de rampa gamma son tablas de búsqueda eficaces que Direct3D usa para asignar los componentes de color del búfer de fotogramas a nuevos niveles que se mostrarán. Puede establecer y recuperar niveles de rampa para la superficie principal llamando a los métodos SetGammaRamp y GetGammaRamp . SetGammaRamp acepta dos parámetros y GetGammaRamp acepta un parámetro. Para SetGammaRamp, el primer parámetro es D3DSGR_CALIBRATE o D3DSGR_NO_CALIBRATION. El segundo parámetro, pRamp, es un puntero a una estructura D3DGAMMARAMP . La estructura D3DGAMMARAMP contiene tres matrices de 256 elementos de WORD, una matriz cada una para contener las rampas gamma rojas, verdes y azules. GetGammaRamp tiene un parámetro que toma un puntero a un tipo D3DGAMMARAMP que se rellenará con la rampa gamma actual.
Puede incluir el valor de D3DSGR_CALIBRATE para el primer parámetro de SetGammaRamp para invocar el calibrador al establecer nuevos niveles gamma. La calibración de rampas gamma incurre en cierta sobrecarga de procesamiento y no se debe usar con frecuencia. Establecer una rampa gamma calibrada proporciona un valor gamma coherente y absoluto para el usuario, independientemente del adaptador de pantalla y el monitor.
No todos los sistemas admiten la calibración gamma. Para determinar si se admite la calibración gamma, llame a GetDeviceCaps y examine el miembro Caps2 de la estructura D3DCAPS9 asociada después de que el método devuelva. Si la marca de funcionalidad de D3DCAPS2_CANCALIBRATEGAMMA está presente, se admite la calibración gamma.
Al establecer nuevos niveles de rampa, tenga en cuenta que los niveles establecidos en las matrices solo se usan cuando la aplicación está en modo exclusivo de pantalla completa. Cada vez que la aplicación cambia al modo normal, los niveles de rampa se reservan y vuelven a surtir efecto cuando la aplicación restablece el modo de pantalla completa.
Si el dispositivo no admite rampas gamma en el modo de presentación actual de la cadena de intercambio (pantalla completa o ventana), no se devuelve ningún valor de error. Las aplicaciones pueden comprobar el D3DCAPS2_FULLSCREENGAMMA y D3DCAPS2_CANCALIBRATEGAMMA bits de funcionalidad en el miembro Caps2 del tipo D3DCAPS9 para determinar las funcionalidades del dispositivo y si se instala un calibrador.
Temas relacionados