Преобразование YUV через фрагментный шейдер

StackOverflow https://stackoverflow.com/questions/145064

  •  02-07-2019
  •  | 
  •  

Вопрос

Я реализовал преобразование YUV в RGB с помощью фрагментного шейдера, написанного на языке шейдеров Nvidia.(Y, U и V хранятся в отдельных текстурах, которые объединяются посредством мультитекстурирования в моем фрагментном шейдере).Он отлично работает под OpenGL, но под Direct3D я просто не могу заставить выходное изображение выглядеть правильно.Я начинаю подозревать, что Direct3D каким-то образом изменяет образцы Y, U и V, прежде чем у меня появится возможность выполнить преобразование YUV.Кто-нибудь знает, вносит ли Direct3D какие-либо изменения в значения, хранящиеся в текстурах, перед запуском фрагментного шейдера и как их отключить>?

Это было полезно?

Решение

Мы это поняли.:) По сути, проблема заключалась в том, что, хотя наши уравнения YUV для RGB были правильными, мы не правильно осуществляли выборку данных V!Так что никакие возни с уравнениями не помогли бы!

В конце концов, я бы порекомендовал следующую стратегию всем, кто пытается это сделать:

1) Установите R, G и B на значение Y.Вы должны получить изображение в оттенках серого (поскольку Y содержит только яркость).2) Затем установите R, G и B на U.У вас должны получиться забавные цвета!3) Наконец установите R, G и B на V.Опять же, у вас должны получиться забавные цвета.

Кроме того, правильная нормализация значений имеет решающее значение.Посетите наш сайт fourcc.org, чтобы обсудить правильную нормализацию YUV.

Другие советы

Единственное предположение, которое приходит на ум, это то, что текстуры имеют неподходящий формат (низкой точности или сжаты).

Можете ли вы описать, почему вывод выглядит неправильно?Есть ли шанс на правильный или неправильный снимок экрана?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top