Gamma (Direct3D 9)

El contenido de textura se almacena a menudo en formato sRGB. Tradicionalmente, las canalizaciones de píxeles presuponen que los colores son lineales, por lo que las operaciones de mezcla se realizaron en el espacio lineal. Sin embargo, dado que el contenido sRGB está corregido por gamma, las operaciones de fusión en el espacio lineal producirán resultados incorrectos. Ahora, las tarjetas de vídeo pueden solucionar este problema deshaciendo la corrección gamma cuando leen cualquier contenido sRGB y volviendo a convertir los datos de los píxeles al formato sRGB cuando los escriben. En este caso, todas las operaciones dentro de la canalización de píxeles se realizan en el espacio lineal.

Corrección gamma

Direct3D 9 puede:

  • Indicar si una textura es gamma 2.2 corregida o no (sRGB o no). El controlador se convertirá en un gamma lineal para las operaciones de fusión en el momento de SetTexture, o el muestreador lo convertirá en datos lineales en el tiempo de búsqueda.
  • Indicar si la canalización de píxeles debe corregir gamma de nuevo al espacio sRGB al escribir en el destino de representación.

Se supone que todos los demás colores (color claro, color de material, color de vértice, etc.) están en un espacio lineal. Las aplicaciones pueden corregir el gamma de los colores escritos en el búfer de cuadros mediante instrucciones del sombreador de píxeles. La linealización solo debe aplicarse a los canales RGB y no al canal alfa.

No todos los formatos de superficie se pueden linealizar. Solo se pueden linealizar los formatos que pasan CheckDeviceFormat con D3DUSAGE_QUERY_SRGBREAD. El estado de la muestra D3DSAMP_SRGBTEXTURE se omite para el resto. Solo se espera que los formatos de textura sin firma admitan esta conversión. Los formatos de textura sin firma solo incluyen componentes R, G, B y L. Si el canal alfa está presente, se omite. Si los formatos mixtos admiten la linealización sRGB, solo se ven afectados los canales sin firma. Lo ideal es que el hardware realice la linealización antes de filtrar, pero en Direct3D 9, el hardware puede realizar la linealización después del filtrado.

No todos los formatos de superficie se pueden escribir en el espacio sRGB. Solo los formatos que pasan CheckDeviceFormat con la marca de uso D3DUSAGE_QUERY_SRGBWRITE se pueden linealizar. El estado de representación D3DRS_SRGBWRITEENABLE se omite para el resto. Se espera que ocho bits por formato RGB sin firma del canal expongan esta capacidad.

Idealmente, el hardware debe realizar las operaciones de fusión del búfer de cuadros en el espacio lineal, pero el hardware puede realizarlo después del sombreador de píxeles, pero antes del mezclador de búfer de cuadros. Esto significa que las operaciones de fusión del búfer de cuadros que tienen lugar en el espacio sRGB producirán resultados incorrectos. D3DRS_SRGBWRITEENABLE se respeta mientras se realiza una desactivación del destino de representación. Para el hardware que admite varios destinos de representación (Direct3D 9) o Texturas de varios elementos (Direct3D 9), solo se escribe el primer destino de representación o elemento.

Cambios en la API

// New sampler state (DWORD)
// If this is nonzero, the texture is linearized on lookup.
D3DSAMP_SRGBTEXTURE       // Default FALSE

// New render state (DWORD)
D3DRS_SRGBWRITEENABLE     // Default FALSE

// New usage flags
D3DUSAGE_QUERY_SRGBWRITE
D3DUSAGE_QUERY_SRGBREAD

Cadenas de intercambio con ventanas

Es útil para las aplicaciones mantener los búferes de reserva de sus cadenas de intercambio en espacio lineal para permitir las operaciones de combinación correctas. Dado que el escritorio normalmente no está en espacio lineal, se requiere una corrección gamma antes de que se pueda presentar el contenido del búfer de reserva. La aplicación puede afectar a esta corrección asignando un búfer adicional y realizando su propia copia correcta desde el búfer lineal al búfer de reserva. Esto requiere una copia adicional que se puede evitar si el controlador realiza la corrección gamma como parte de la transferencia de bloques de bits de presentación.

En Direct3D 9 hay una nueva marca, D3DPRESENT_LINEAR_CONTENT, disponible para Present que permite que la presentación se convierta implícitamente de espacio lineal a sRGB/gamma 2.2. Las aplicaciones deben especificar esta marca si el formato de búfer de 16 bits es de punto flotante de 16 bits para que coincida con el modo de ventana presente en el comportamiento gamma de pantalla completa, siempre que se devuelva D3DCAPS3_LINEAR_TO_SRGB_PRESENTATION para las funcionalidades del dispositivo recuperadas a través de GetDeviceCaps.

Búfer de cuadros