Pregunta

He implementado una conversión de YUV a RGB a través de un sombreador de fragmentos escrito en el lenguaje de sombreado de Nvidia. (Y, U y V se almacenan en texturas separadas que se combinan a través de texturas múltiples en mi sombreador de fragmentos). Funciona muy bien con OpenGL, pero bajo Direct3D simplemente no puedo hacer que la imagen de salida se vea bien. Estoy empezando a sospechar que Direct3D está modificando de alguna manera las muestras Y, U y V antes de que tenga la oportunidad de hacer mi conversión de YUV. ¿Alguien sabe si Direct3D realiza alguna modificación a los valores almacenados en las texturas antes de ejecutar el sombreado de fragmentos y cómo deshabilitarlos > ;?

¿Fue útil?

Solución

Lo descubrimos. :) Básicamente, el problema era que, si bien nuestras ecuaciones de YUV a RGB eran correctas, ¡no estábamos muestreando correctamente los datos de V! ¡Así que ninguna cantidad de futzing con las ecuaciones hubiera ayudado!

Al final, recomendaría la siguiente estrategia para cualquiera que intente hacer esto:

1) Establezca R, G y B en el valor de Y. Debe obtener una imagen en escala de grises (ya que Y solo contiene luminancia). 2) A continuación, establece R, G y B en U. ¡Debes obtener colores divertidos! 3) Finalmente, establezca R, G y B en V. De nuevo, debería obtener colores divertidos.

Además, normalizar correctamente los valores es crítico. Consulte nuestro fourcc.org para una discusión de la normalización adecuada de YUV.

Otros consejos

La única sugerencia que me viene a la mente es que las texturas están en un formato inadecuado (de baja precisión o comprimido).

¿Puedes describir de qué manera la salida se ve mal? ¿Alguna posibilidad de una captura de pantalla correcta o incorrecta?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top